将剧本中的列表列表传递给单个命令(不是 with_items)

将剧本中的列表列表传递给单个命令(不是 with_items)

我有两组主机: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。您必须检查哪种方法适合您。

相关内容