如何在Jinja模板中正确填充vars_ip.yml中的变量值?
解决方案
问题出在Jinja模板里动态引用变量的方式不对。你当前写的var[layer.things_dr[loop.index-1]]无法正确解析变量,因为vars_ip.yml里的内容是以IP字符串作为变量名的键值对(比如12.1.1.25: TAP1实际是定义了名为12.1.1.25的变量,值为TAP1),需要用Jinja的vars字典来通过字符串键获取对应值。
修改后的Jinja模板(varloop.j2)
{% for layer in layers %} {% for item in layer.things_prod %} {% set dr_item = layer.things_dr[loop.index-1] %} {{ item }} {{ dr_item }} {{ vars[item] }} {{ vars[dr_item] }} {% endfor %} {% endfor %}
关键说明
- 用
set dr_item = ...把DR侧的IP单独存成变量,让代码更易读; vars[item]:通过vars字典,以当前循环的prod侧IP字符串为键,取出vars_ip.yml里对应的设备名称(比如TAP1);vars[dr_item]:同理获取DR侧IP对应的设备名称(比如TAP3)。
验证结果
运行你的Playbook后,生成的sync.html会完全符合期望:
12.1.1.25 11.0.0.26 TAP1 TAP3 12.1.1.26 11.0.0.27 TAP2 TAP4 9.2.2.211 10.7.7.28 SAT1 SAT3 9.2.2.212 10.7.7.29 SAT2 SAT4 9.2.2.213 10.7.7.30 SAT5 SAT6
可选优化:规范变量结构
如果想让vars_ip.yml的写法更符合Ansible常规规范(避免用IP作为变量名),可以把它改成字典形式:
--- ip_to_device: 12.1.1.25: TAP1 12.1.1.26: TAP2 11.0.0.26: TAP3 11.0.0.27: TAP4 9.2.2.211: SAT1 9.2.2.212: SAT2 10.7.7.28: SAT3 10.7.7.29: SAT4 9.2.2.213: SAT5 10.7.7.30: SAT6
对应的模板改成:
{% for layer in layers %} {% for item in layer.things_prod %} {% set dr_item = layer.things_dr[loop.index-1] %} {{ item }} {{ dr_item }} {{ ip_to_device[item] }} {{ ip_to_device[dr_item] }} {% endfor %} {% endfor %}
这种写法结构更清晰,后续维护也更方便。
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

