当前位置: 首页 > 知识库问答 >
问题:

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

皇甫建木
2023-03-14

我试图对多个主机运行使用相同名称的容器运行ansible playbook。有3台主机,每个主机运行一个名为“Web”的容器。我在试着用docker连接。

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

共有1个答案

谭煜
2023-03-14

你得到的结果绝对是意料之中的。引用add_host文档

这个模块绕过play host循环,只对play中的所有主机运行一次,如果您需要它进行迭代,请使用with-loop构造。

也就是说,add_host不能依赖hosts循环,而需要自己创建一个循环。

假设所有的docker主机都在DockerHosts组中,下面的playbook应该可以完成这项工作。我目前不在一个情况下,我可以测试自己,所以你可能需要调整一点。让我知道它是否对你有帮助,如果我必须编辑我的答案。

请注意,尽管add_host任务不会自然循环,但我在第一次播放中保留了原始组中的主机,以便正确地收集事实,并在hostvars魔术变量中正确地填充事实

---
- 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
 类似资料:
  • 问题内容: 我是Swift的新手,我已经遍历了一些教程,其中许多教程使用同一个名称多次定义了一个函数。 我已经习惯了其他编程语言,否则将无法执行此操作。 因此,我检查了官方的Swift手册,还检查了override关键字,以了解可以得到的结果,但是仍然无法理解以下代码: 从我看到的函数tableView设置在第1行和第5行,我注意到的唯一区别是第一个tableView函数返回,而第二个函数返回(U

  • 问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这

  • 我有一个依赖于多个docker容器的应用程序。我使用docker撰写,以便所有容器都在同一个网络中进行容器间通信。但是,我的两个容器在各自的容器中监听相同的端口8080,但是映射到主机上的不同端口: 8072,8073。对于集装箱间的通信,因为我们使用集装箱的端口,这会引起问题吗? 限制条件: 我需要两个容器才能运行我的应用程序。因此,我无法将具有相同内部端口的其他容器隔离到不同的网络 所有容器都

  • 我想对两个不同的数据帧执行一些sql操作。不幸的是,就像我处理的数据一样,拼写通常是不同的。 下面是一个示例,其中userid属于df1,username属于df2。有人帮我吗?

  • 由于ES的docker容器,我面临一个奇怪的问题,我之前在9200主机端口的docker容器中运行独立的ES 7.10(内部docker端口与标准9200和9300 ES端口相同),同时,我启动了三个ES docker容器(有一个不同的小版本7)(它们应该组成集群,让我们把它命名为docker ES集群)。 这三个ES docker容器使用的主机端口为9200、92019202,因此,由于端口冲突