从Ansible中管理Docker容器

sme*_*eeb 4 ansible docker

我正在编写我的第一本Ansible剧本,并且需要一些转向.我有一个由3个VM组成的简单网络:

  • ansible01 - 我的Ansible服务器(Ubuntu)
  • db01 - 一个DB(再次,Ub​​untu)
  • myapp01 - 托管Java应用程序的Ubuntu VM

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

[databases]
db01.example.com

[app_servers]
myapp01.example.com
myapp02.example.com
Run Code Online (Sandbox Code Playgroud)

我已正确配置SSH,我可以运行ansible all ping -m,Ansible能够ping数据库和应用服务器节点.到现在为止还挺好.

我正在尝试编写三(3)个与Docker相关的剧本,它们将完成以下任务:

  • 确保码头工人在所有运行[databases]节点以及所有[ app_servers]节点; 如果没有安装并运行,则安装Docker引擎并开始运行它.如果已安装但未运行,请重新启动它.
  • 停止/启动/重启所有为特定类型的节点运行的容器(" 角色 "?!?).例如,我想告诉Ansible我想重新启动所有[app_servers]节点上运行的所有容器.
  • 停止/启动/重新启动在任意节点上运行的任意容器.例如,可能myapp01有2个容器在其上运行,fizz并且buzz.我希望能够告诉Ansible重新启动(特别)myapp01fizz容器,但不是它的buzz容器,也没有任何myapp02的容器.

相信这些属于三个单独的剧本(如果我错了或者有更好的方法,请纠正我).我对他们进行了刺伤.首先是setup_docker.yml:

- name: ensure docker engine is installed and running
  docker:
    name: *
    state: started
Run Code Online (Sandbox Code Playgroud)

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

- name: restart app servers
  docker:
    name: app_servers
    state: restarted
Run Code Online (Sandbox Code Playgroud)

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

- name: restart a specific container
  docker:
    name: %name_of_container_and node%
    state: restarted
Run Code Online (Sandbox Code Playgroud)

但这里有几个问题:

  1. setup_docker.yml,如何指定所有节点类型([databases][app_servers])应该受到影响?我知道星号("*")不正确.
  2. restart_app_servers.yml,该name领域的适当价值是什么?我如何告诉Ansible重启所有app_server节点?
  3. restart_container.yml,如何"注入"(作为参数/变量传入)节点和容器的名称?理想情况下,我想对任何节点和任何容器运行此playbook.
  4. 还有什么东西跳出来对你错了吗?

提前致谢!

cat*_*n87 5

我认为你在这里有戏剧和剧本的含义.您在上面指定的三件事,setup_docker.yml,restart_app_servers.yml和restart_container.yml似乎是Plays.我建议创建一个Docker角色,其中包含您在此处详述的任务.

解决您的问题:

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

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

#docker.yml
- hosts: all
  user: {{ privileged_user }} 
  gather_facts: false
  roles: 
    - install_docker
Run Code Online (Sandbox Code Playgroud)

然后在你的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
Run Code Online (Sandbox Code Playgroud)
  1. 在restart_app_servers.yml中,name字段的正确值是什么?我如何告诉Ansible重新启动所有app_server节点?

我假设你想要重新启动属于app-server组的每个节点上的所有Docker容器?我会保留每个组的所有容器名称的清单(因为这个例子相对简单).例如:

#group_vars/app-server
all_containers: [ 'container1', 'container2', 'container3',.. 'containern' ]
Run Code Online (Sandbox Code Playgroud)

从这里,您可以在Play中使用此库存重新启动每个容器.在您的Playbook中:

#restart_app_containers.yml
- hosts: app_server
  user: {{ privileged_user }}
  gather_facts: false
  roles: 
    - restart_app_servers
Run Code Online (Sandbox Code Playgroud)

然后在Play本身:

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

对于此部分,您需要直接引用您需要采取行动的容器.这可以通过动态库存来完成,例如

#sample.yml
- hosts: Tag_name_{{ public_name }}
  user: {{ privileged_user }}
  gather_facts: false
  roles:
    - example
Run Code Online (Sandbox Code Playgroud)

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

ansible-playbook -i $INVENTORY_FILE -e container_name=$CONTAINER_NAME restart_single_container_on_single_host.yml 
Run Code Online (Sandbox Code Playgroud)

你的Play看起来像这样:

- name: restart a specific container
  docker:
    name: {{ container_name }}
    state: restarted
Run Code Online (Sandbox Code Playgroud)