Templates 带有if条件库存名称的ansible模板

Templates 带有if条件库存名称的ansible模板,templates,ansible,Templates,Ansible,实际上,我尝试为网桥创建网络配置。为此,我在组变量中有以下内容 --- backbone_ip: - name: server2 ipv4: 111.111.111.2/24 ipv6: 2001:111:111:1::2/64 - name: server3 ipv4: 111.111.111.3/24 ipv6: 2001:111:111:1::3/64 - name: server5 ipv4: 111.111.111.5/24 ipv6: 2001:111:111

实际上,我尝试为网桥创建网络配置。为此,我在组变量中有以下内容

---
backbone_ip:
- name: server2
  ipv4: 111.111.111.2/24
  ipv6: 2001:111:111:1::2/64
- name: server3
  ipv4: 111.111.111.3/24
  ipv6: 2001:111:111:1::3/64
- name: server5
  ipv4: 111.111.111.5/24
  ipv6: 2001:111:111:1::5/64
我使用模板模块编写配置。模板:

auto br-{{ bridge_network }}
iface br-{{ bridge_network }} inet static
{% for server in backbone_ip %}
{% if server.name in hostvars[host].inventory_hostname %}
        address {{ server.ipv4 }}
        bridge_ports none
        bridge_stp off
        bridge_fd 0

iface br-{{ bridge_network }} inet6 static
        address {{ server.ipv6 }}
{% endif %}
{% endfor %}
现在我的问题是,如果server.name是ansible实际连接到的服务器的清单名称,我只想写这些行

hostvars[host]。清单\u主机名似乎错误。 应该修改to=还是语法如何

谢谢
pr0

对于这个用例,列表的结构是错误的。把它改成字典

backbone\u dict:
服务器2:
ipv4:111.111.111.2/24
ipv6:2001:111:111:1::2/64
服务器3:
ipv4:111.111.111.3/24
ipv6:2001:111:111:1::3/64
服务器5:
ipv4:111.111.111.5/24
ipv6:2001:111:111:1::5/64
那么属性的寻址就很简单了,例如

-调试:
msg:“{{backbone\u dict[inventory\u hostname].ipv4}”
如果您不能更改数据的结构,请先转换它,例如

-设置事实:
主干网目录:{{dict({keys}zip(主干网ip))}
变量:
_键:{{backbone|ip | map(attribute='name')| list}
跑一次:对

谢谢,有时候很简单。它可以工作,而且容易得多。但是我有一个小问题。我有变量{{bridge_network}}。如何在模板中使用主干目录。主干应该是{{bridge_network}这不起作用{{{{bridge_network}}dict[inventory_hostname].ipv4}}IIUC,问题是间接引用变量(不包括在问题中)。看见如果这不是你想要的,就提出一个新问题。事实上,你不应该评论与这个问题和答案无关的问题。在这种情况下,如果找不到答案,请始终打开一个新问题。