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

时间:2019-06-17 20:39:13

标签: ansible

我正在尝试对运行相同名称容器的多个主机运行ansible剧本。有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_host }},以使其在主机之间是唯一的,但随后它尝试连接到web_web1。我一直在使用sudo docker exec web rm -rf /var/log/old_logs运行命令,该命令当然有效,但是我希望能够直接在docker容器中使用ansible模块。

1 个答案:

答案 0 :(得分:0)

绝对可以得到您得到的结果。引用add_host documentation

  

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

即您不能依赖add_host的主机循环,而需要自己进行循环。

此外,对于动态创建的主机,您绝对需要使用不同的名称(即inventory_hostname),但是由于所有docker容器都具有相同的名称,因此它们的ansible_host应该相同。

假设所有docker主机都在dockerhosts组中,则以下剧本应该可以完成此工作。我目前无法自己进行测试,因此您可能需要进行一些调整。让我知道它是否对您有帮助,以及是否需要编辑我的答案。

请注意,即使add_host任务不会自然循环,我还是在第一场比赛中将主机保留在原始组中,以便在hostvars {{3 }}

---
- 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