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