从 Ansible play 管理 Docker 容器

2024-02-29

我正在编写我的第一本 Ansible 剧本,需要一些指导。我有一个由 3 个虚拟机组成的简单网络:

  • ansible01- 我的 Ansible 服务器 (Ubuntu)
  • db01- 一个数据库(同样,Ubuntu)
  • myapp01- 托管 Java 应用程序的 Ubuntu VM

我已经配置了我的/etc/ansible/hosts像这样的文件:

[databases]
db01.example.com

[app_servers]
myapp01.example.com
myapp02.example.com

我已经正确配置了 SSH,并且可以运行ansible all ping -mAnsible 能够 ping 通数据库和应用程序服务器节点。到目前为止,一切都很好。

我正在尝试编写三 (3) 个与 Docker 相关的手册,以完成以下任务:

  • 确保 Docker 正在所有计算机上运行[databases]节点以及所有 [app_servers]节点;如果尚未安装并运行,则安装 Docker 引擎并开始运行它。如果已安装但未运行,请重新启动它。
  • 停止/启动/重新启动为特定类型的节点运行的所有容器(“role“?!?)。例如,我想告诉 Ansible 我想重新启动所有运行在所有容器上的容器。[app_servers] nodes.
  • 停止/启动/重新启动在任意节点上运行的任意容器。例如,也许myapp01有 2 个容器在上面运行,fizz and buzz。我希望能够告诉 Ansible 重新启动(特别是)myapp01’s fizz容器,但是not its buzz容器,也没有任何myapp02容器。

I believe这些属于三个不同的剧本(如果我错了或者有更好的方法,请纠正我)。我向他们刺了刺。第一个是setup_docker.yml:

- name: ensure docker engine is installed and running
  docker:
    name: *
    state: started

然后重新启动所有[databases], in restart_app_servers.yml:

- name: restart app servers
  docker:
    name: app_servers
    state: restarted

并用于在单个节点上重新启动任意容器(restart_container.yml):

- name: restart a specific container
  docker:
    name: %name_of_container_and node%
    state: restarted

但这里有几个问题:

  1. In setup_docker.yml,如何指定所有节点类型([databases] and [app_servers])应该受到影响吗?我知道星号(“*”)不正确。
  2. In restart_app_servers.yml,正确的值是多少name场地?我实际上如何告诉 Ansible 重新启动所有内容app_server nodes?
  3. In restart_container.yml,如何“注入”(作为参数/变量传入)节点和容器的名称?理想情况下,我想针对任何节点和任何容器运行此剧本。
  4. 还有什么事情让你觉得不对劲吗?

提前致谢!


我认为您在这里混淆了剧本和剧本的含义。您在上面指定的三件事:setup_docker.yml、restart_app_servers.yml 和 restart_container.yml 似乎是 Play。我建议创建一个 Docker 角色,其中包含您在此处详细介绍的任务。

为了解决您的问题:

  1. 在 setup_docker.yml 中,如何指定所有节点类型([databases] 和 [app_servers])都应受到影响?我知道星号(“*”)不正确。

这是在 Playbook 级别完成的。您可以指定哪些主机受哪些任务影响,例如:

#docker.yml
- hosts: all
  user: {{ privileged_user }} 
  gather_facts: false
  roles: 
    - install_docker

然后在您的 install_docker 角色中,您将拥有以下内容:

- name: Add docker apt keys
  apt_key: keyserver=keyserver.ubuntu.com id=36A1D7869245C8950F966E92D8576A8BA88D21E9
- name: update apt 
  apt_repository: repo='deb https://get.docker.com/ubuntu docker main' state=present
- name: Install docker
  apt: pkg=lxc-docker update_cache=yes
  1. 在 restart_app_servers.yml 中,名称字段的正确值是什么?我实际上如何告诉 Ansible 重新启动所有 app_server 节点?

我假设您的意思是您希望重新启动属于应用程序服务器组的每个节点上的所有 Docker 容器? 我会保留每个组的所有容器名称的清单(因为这个示例相对简单)。例如:

#group_vars/app-server
all_containers: [ 'container1', 'container2', 'container3',.. 'containern' ]

从这里,您可以在 Play 中使用此清单来重新启动每个容器。在你的剧本中:

#restart_app_containers.yml
- hosts: app_server
  user: {{ privileged_user }}
  gather_facts: false
  roles: 
    - restart_app_servers

然后在 Play 本身中:

#restart_app_servers.yml
- name: restart app servers
  docker:
    name: {{ item }}
    state: restarted
  with_items: all_containers
  1. 在 restart_container.yml 中,如何“注入”(作为参数/变量传递)节点和容器的名称?理想情况下,我想针对任何节点和任何容器运行此剧本。

对于这部分,您需要直接引用您需要执行操作的容器。这可以通过动态库存来完成,例如

#sample.yml
- hosts: Tag_name_{{ public_name }}
  user: {{ privileged_user }}
  gather_facts: false
  roles:
    - example

如果您在 AWS 上。主机字典会因基础设施而异。 然后在你列出的实际玩法中,你可以传入特定的变量。由于它是单个主机上的单个容器,因此您可以通过命令行执行此操作:

ansible-playbook -i $INVENTORY_FILE -e container_name=$CONTAINER_NAME restart_single_container_on_single_host.yml 

你的 Play 看起来像这样:

- name: restart a specific container
  docker:
    name: {{ container_name }}
    state: restarted
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Ansible play 管理 Docker 容器 的相关文章

随机推荐