从 jinjar2 模板中的清单循环 Ansible hostvars

Loop Ansible hostvars from inventory in jinjar2 template

我是 Ansible 的新手,只是库存中的变量有问题。在清单中,我有不同的变量,其中包含 MAC 或 IP 地址。我想遍历它们,如果存在,则在 jinjar2 模板中处理它们。

我的库存(缩短):

net6_prd:
      children:
        net6_prd_test:
          hosts:
            net6-tst-01: 
              eth1_mac: "001 eth1 mac" 
              eth1_ip: "001 eth1 ip"  
              eth2_mac: "001 eth2 mac"
              eth2_ip: "001 eth2 ip"
            net6-tst-02: 
              eth1_mac: "002 eth1 mac"
              eth1_ip: "002 eth1 ip"
              eth2_mac: "002 eth2 mac"
              eth2_ip: "002 eth2 ip"

在 jinjar2 模板中,我使用了以下循环:

{% for ihost in hostvars -%}
 # example={{ hostvars[items]['eth1_mac'] }}
{% endfor %}

不幸的是,这不起作用。 Ansible 报告变量不存在。

FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'eth1_mac'"}

我也曾尝试通过 groups[net6_prd]net6_prd 中的所有主机进行 运行,但这也不起作用。其他人知道我的循环有什么问题吗?

变量hostvars实际上包含了所有的主机,不管他们是不是剧中目标。这就是您可能会遇到此问题的原因,您的主机可能没有在您的清单中定义这些变量。

根据您要循环的主机,您可以使用:

  • ansible_play_hostsspecial variable,其中

    List of hosts in the current play run, not limited by the serial. Failed/Unreachable hosts are excluded from this list.

  • groups['net6_prd_test'],这将列出名为 net6_prd_test
  • 的组中的所有主机
  • 根据您的需要,还有更多选择。

所以你最终会在你的模板中:

{% for _host in ansible_play_hosts %}
 # example={{ hostvars[_host].eth1_mac }}
{% endfor %}

如果你真的无法避免使用那些未定义的变量来定位主机,你也可以在你的循环中进行过滤:

{% for _host in hostvars if hostvars[_host].eth1_mac is defined %}
 # example={{ hostvars[_host].eth1_mac }}
{% endfor %}