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,问题是间接引用变量(不包括在问题中)。看见如果这不是你想要的,就提出一个新问题。事实上,你不应该评论与这个问题和答案无关的问题。在这种情况下,如果找不到答案,请始终打开一个新问题。