You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 %}

关键说明

  1. 用set dr_item = ...把DR侧的IP单独存成变量,让代码更易读;
  2. vars[item]:通过vars字典,以当前循环的prod侧IP字符串为键,取出vars_ip.yml里对应的设备名称(比如TAP1);
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:17:33