我正在尝试对运行相同名称容器的多个主机运行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模块。
答案 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