我有两组主机:dc1 和 dc2。也合并为一个 DC 组。
我需要将外部 DC 中的主机 IP 地址列表传递给命令。with_items 在这里根本不起作用。
看起来应该是这样的:
somescript -H 10.10.10.3 -H 10.10.10.4
因此有 2 点:1. 获取组 DC 中的主机列表(不包括主机主组中的主机)。不确定这是否可行,所以最不明智的方法是设置 remote_dc 变量(或数组)。2. 假设我们有来自 p.1 的主机列表:groups[remote_dc]。如何将其用作 hostvars[key]['ansible_eth1']['ipv4']['address'] 的键并以列表形式获取结果?
现在我不得不使用一种非常肮脏的方法:我为每个 DC 组创建了一个 remote_addresses 列表并像这样进行迭代:
command: somescript -H {{ remote_addresses|join(' -H ') }}
那么,是否有适当的方法来实现 p.1 和 p.2,并省略手动创建 ip 地址列表?
答案1
这ansible 文档有这个例子:
一个经常使用的做法是遍历一个组来查找该组中的所有 IP 地址:
{% for host in groups['app_servers'] %}
{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}
它大致满足了你的要求。你可以像这样使用它:
- name: Execute somescript
command: >
somescript {% for host in groups['app_servers'] %}
-H {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}
现在,您还想将主机本身从 IP 地址列表中排除。您可以通过如下修改来实现{% for %}
:
{% for host in groups['app_servers'] if host != ansible_host %}
ansible_host
您可能需要使用ansible_fqdn
或,而不是ansible_nodename
。您必须检查哪种方法适合您。