多个主机上具有相同容器名称的Ansible docker连接

多个主机上具有相同容器名称的Ansible docker连接,ansible,Ansible,我正试图运行一个ansible playbook来对抗多个运行同名容器的主机。有3台主机,每个主机运行一个名为“web”的容器。我正在尝试使用docker连接 我使用的是hosts文件的典型模式,它非常适合在主机上运行ansible模块 - name: Ping ping: - name: Add web container to inventory add_host: name: web ansible_connection: docker ansible_d

我正试图运行一个ansible playbook来对抗多个运行同名容器的主机。有3台主机,每个主机运行一个名为“web”的容器。我正在尝试使用docker连接

我使用的是
hosts
文件的典型模式,它非常适合在主机上运行ansible模块

- name: Ping
  ping:

- name: Add web container to inventory
  add_host:
    name: web
    ansible_connection: docker
    ansible_docker_extra_args: "-H=tcp://{{ ansible_host }}:2375"
    ansible_user: root
  changed_when: false

- name: Remove old logging directory
  delegate_to: web
  file:
    state: absent
    path: /var/log/old_logs
它只对
hosts
文件中的第一个主机起作用

PLAY [all]

TASK [Gathering Facts]
ok: [web1]
ok: [web2]
ok: [web3]


TASK [web-playbook : Ping]
ok: [web1]
ok: [web2]
ok: [web3]

TASK [web-playbook : Add sensor container to inventory] 
ok: [web1]

PLAY RECAP 
web1  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web2  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web3  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

我尝试将
name
设置为
web{{{{ansible\u host}}
以使其在主机之间唯一,但它随后尝试连接到
web\u web1
。我一直在使用sudo docker exec web rm-rf/var/log/old_logs运行命令,当然可以,但是我希望能够直接在docker容器中使用ansible模块。

您得到的结果是完全可以预料的。引用

此模块绕过播放主机循环,仅对播放中的所有主机运行一次,如果需要使用with循环构造进行迭代

i、 e.
add_host
不能依赖hosts循环,需要自己做一个循环

此外,对于动态创建的主机,您肯定需要有不同的名称(即
inventory\u hostname
),但由于所有docker容器都有相同的名称,因此它们的
ansible\u主机
应该是相同的

假设您的所有docker主机都在组
dockerhosts
中,下面的剧本应该可以完成这项工作。我目前还不能自己测试,所以你可能需要调整一下。让我知道它是否对您有帮助,以及我是否需要编辑我的答案

请注意,即使
add_host
任务不会自然循环,我在第一个剧本中将主机保留在原始组中,以便在
hostvars


谢谢,这看起来是个不错的方法。我包含的代码来自
roles//tasks/docker\u containers.yml
,因此我认为我的结构有误。我应该把
add_host
任务放在哪里
site.yml
main.yml
?对于这个问题,我可能会给出十几个不同的正确答案(插入位置、循环变量等)。您必须根据您的情况,考虑到维护等因素,找出更有意义的方法。。。如果您的角色仅负责容器中的操作,我将从docker host的静态组在我的主剧本中动态创建组,然后在创建的组中扮演角色。谢谢,我将重新组织角色,以便在主机上运行的任务与应该在容器中运行的任务分开。
---
- name: Create dynamic inventory for docker containers
  hosts: dockerhosts

  tasks:
    - name: Add web container to inventory
      add_host:
        name: "web_{{ item }}"
        groups:
          - dockercontainers
        ansible_connection: docker
        ansible_host: web
        ansible_docker_extra_args: "-H=tcp://{{ hostvars[item].ansible_host }}:2375"
        ansible_user: root
      loop: "{{ groups['dockerhosts'] }}"

- name: Play needed commands on containers
  hosts: dockercontainers

  tasks:
    - name: Remove old logging directory
      file:
        state: absent
        path: /var/log/old_logs