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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:40:55