Jinja2循环中如何动态调用Python传入的VLAN IP变量值?
Jinja2循环动态引用变量值的解决方法
问题场景
现有存储VLAN信息的YAML文件:
#yaml_file.yaml - vlan: 123 name: DATEN-VLAN - vlan: 124 name: PRINTER-VLAN - vlan: 125 name: WLAN-VLAN
编写Jinja2模板遍历VLAN:
{% for vlan in vlans %} interface {{INTERFACE}}.{{vlan['vlan']}} description {{vlan['name']}} ip address {{'V_VLAN_IP_' ~ vlan['vlan']}} {% endfor %}
通过Python渲染模板时传入变量:
template = template.render( vlans=vlans, INTERFACE="Gi0/1", V_VLAN_IP_123="192.168.100.1", V_VLAN_IP_124="192.168.200.1", V_VLAN_IP_125="192.168.300.1" )
当前输出仅显示变量名字符串,无法解析为对应的IP值,期望将拼接的变量名替换为实际IP。
解决方案
方法1:改用字典传递IP映射(推荐)
将IP整理为字典,结构更清晰,模板中直接通过VLAN ID取对应IP:
修改Python代码:
template = template.render( vlans=vlans, INTERFACE="Gi0/1", vlan_ips={ 123: "192.168.100.1", 124: "192.168.200.1", 125: "192.168.300.1" } )
修改Jinja2模板:
{% for vlan in vlans %} interface {{INTERFACE}}.{{vlan['vlan']}} description {{vlan['name']}} ip address {{vlan_ips[vlan['vlan']]}} {% endfor %}
方法2:使用Jinja2的vars()函数获取上下文变量
利用vars()获取当前模板上下文的变量字典,通过拼接的键名取值:
修改Jinja2模板:
{% for vlan in vlans %} interface {{INTERFACE}}.{{vlan['vlan']}} description {{vlan['name']}} ip address {{ vars()['V_VLAN_IP_' ~ vlan['vlan']] }} {% endfor %}
方法3:使用attribute过滤器
通过attribute过滤器动态获取变量值:
修改Jinja2模板:
{% for vlan in vlans %} interface {{INTERFACE}}.{{vlan['vlan']}} description {{vlan['name']}} ip address {{ this | attribute('V_VLAN_IP_' ~ vlan['vlan']) }} {% endfor %}
以上三种方法都能实现动态变量值的解析,其中方法1的字典方式更易于维护和扩展。
内容的提问来源于stack exchange,提问作者Joebel
相关产品推荐
相关产品推荐

