多个主机上具有相同容器名称的Ansible docker连接
我正试图运行一个ansible playbook来对抗多个运行同名容器的主机。有3台主机,每个主机运行一个名为“web”的容器。我正在尝试使用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
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