从Ansible plays管理Docker容器

4
我正在撰写我的第一个Ansible playbook,需要一些指导。我有一个简单的网络,由3个VM组成:
  • ansible01 - 我的 Ansible 服务器 (Ubuntu)
  • db01 - 一个 DB (同样是 Ubuntu)
  • myapp01 - 一个托管 Java 应用的 Ubuntu VM
我已经按如下方式配置了我的 /etc/ansible/hosts 文件:
[databases]
db01.example.com

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

我已经正确地配置了SSH,我可以运行ansible all ping -m,Ansible能够ping通DB和app服务器节点。目前为止一切顺利。

我正在尝试编写三个与Docker相关的playbooks,以完成以下操作:

  • 确保所有的[数据库]节点和所有[应用服务器]节点都在运行Docker;如果没有安装和运行,则安装Docker引擎并开始运行它;如果已经安装但未运行,则重新启动。
  • 停止/启动/重启特定类型节点上运行的所有容器(“角色"?)。例如,我想告诉Ansible我要重新启动在所有[应用服务器]节点上运行的所有容器。
  • 停止/启动/重启在任意节点上运行的任意容器。例如,也许myapp01上有2个容器在运行,fizzbuzz。我想能够告诉Ansible重新启动(具体地说)myapp01fizz容器,但不包括其buzz容器,也不包括任何myapp02容器。

认为这些应该放在三个单独的playbooks中(如果我错了或有更好的方法请纠正我)。我尝试着编写它们。第一个是setup_docker.yml

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

然后,在restart_app_servers.yml中重启所有[databases]

- 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. setup_docker.yml 中,我该如何指定所有节点类型 ([databases][app_servers]) 都应受影响?我知道星号 (“*”) 是不正确的。
  2. restart_app_servers.yml 中,name 字段的正确值是什么?我该如何告诉 Ansible 重启所有 app_server 节点?
  3. restart_container.yml 中,我该如何“注入”(作为参数/变量传递)节点和容器的名称?理想情况下,我希望运行此 playbook 对任何节点和任何容器进行操作。
  4. 还有其他错误吗?
谢谢!
1个回答

5
我觉得您在这里把 Plays 和 Playbooks 的含义混淆了。 您上面指定的三个事物,setup_docker.yml,restart_app_servers.yml和restart_container.yml,似乎是Plays。 我建议创建一个Docker Role,其中包含您在此处详细说明的任务。
为解决您的问题:
1. 在setup_docker.yml中,如何指定所有节点类型([databases]和[app_servers])都会受到影响?我知道星号(“*”)是不正确的。
这是在Playbook级别完成的。您可以指定要受哪些任务影响的主机,例如:
#docker.yml
- hosts: all
  user: {{ privileged_user }} 
  gather_facts: false
  roles: 
    - install_docker

在您的安装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文件中,name字段的正确值是什么?我应该如何告诉Ansible重新启动所有app_server节点?

我假设您希望重启属于app-server组的每个节点上的所有Docker容器? 我建议为每个组维护一个包含所有容器名称的清单(因为此示例相对简单)。例如:

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

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

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

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

对于此部分,您需要直接引用要操作的容器。这可以通过动态清单实现,例如:

#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 

您的游戏会类似于以下内容:
- name: restart a specific container
  docker:
    name: {{ container_name }}
    state: restarted

注意:安装Docker的https://get.docker.com/ubuntu已被弃用。请使用http://get.docker.com。请参阅https://blog.docker.com/2015/07/new-apt-and-yum-repos/。 - user2707671

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接