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

如何在Jinja模板输出中正确引用嵌套YAML变量

问题根因

Jinja2 原生支持任意层级的嵌套结构变量引用,渲染空白和嵌套结构无关,是两处逻辑错误导致:

  • 生成的output.yaml中data字段是列表类型,所有配置项都存放在data列表的第一个元素(data[0])下。模板中写{{data.name}}是尝试直接访问列表对象的name属性,不存在该属性自然返回空值。
  • 模板中直接引用{{l15pass}}也不成立:l15pass不在YAML根层级,而是嵌套在data[0]下,根层级无对应键就会渲染为空。
修复方案(无需移除ruamel.yaml,完全保留现有嵌套结构)

两种方案二选一即可,推荐第一种,改动量最小:

方案1:调整模板传参逻辑

修改mergeTxt函数中的渲染传参代码,直接把实际存放配置的字典解包传入模板,无需修改现有模板内容:

def mergeTxt(swSN):
    filenames = ['template.txt','svi.txt']
    with open('merged.txt', 'w') as outfile:
        for names in filenames:
            with open(names) as infile:
                outfile.write(infile.read())
            outfile.write("\n")
    config = yaml.safe_load(open('output.yaml'))
    env = Environment(loader = FileSystemLoader('./'), trim_blocks=True, lstrip_blocks=True)
    template = env.get_template('merged.txt')
    # 仅修改下面这行,传入data列表首个元素的所有键值对作为模板变量
    targetconfig = template.render(**config['data'][0])

修改后模板中现有的{{name}}、{{l15pass}}等变量可直接正常取值。

方案2:调整模板变量路径

如果不想修改Python传参逻辑,就把模板中所有变量的引用路径写对,注意data是列表,需要加索引:

hostname {{data[0].name}}
!
!
! 
feature nxapi
feature bash-shell
feature tacacs+
feature bgp
feature pim
feature bfd
!
!
!
!
clock timezone CST -6 0
clock summer-time CDT 2 Sun Mar 02:00 1 Sun Nov 02:00 60
username admin password {{data[0].l15pass}}  role network-admin

该方案不需要改动Python代码,但所有变量都要加data[0].前缀,后续维护成本更高。

不依赖ruamel.yaml的YAML追加方案

如果后续需要替换ruamel.yaml,用PyYAML即可实现同等的YAML读写修改能力,只是需要手动指定缩进参数匹配原有格式,示例代码:

import yaml
import re

def fixupYamlWithoutRuamel(tgt_sw,bgp,loopback):
    loopback = ''.join(map(str,loopback))
    loopfinal = re.sub(r"[\([{''})\]]", "", loopback)
    bgpid = loopfinal[:-3]
    bgp = list(map(int,bgp))
    # 加载原有配置
    with open('device.yaml', 'r', encoding='utf-8') as f:
        config = yaml.safe_load(f)
    data = config['data']
    data[0]['name'] = tgt_sw
    data[0]['BGPASN'] = bgp
    data[0]['l15pass'] = 'test'
    data[0]['l0'] = loopfinal
    data[0]['bgpid'] = bgpid
    # 写入输出文件,指定缩进匹配原有格式
    with open('output.yaml', 'w', encoding='utf-8') as f:
        yaml.dump(config, f, default_flow_style=False, indent=4, allow_unicode=True)

该方案生成的YAML文件可被正常解析,仅序列缩进格式可能和ruamel.yaml输出有细微差异,不影响业务使用。

内容的提问来源于stack exchange,提问作者pcam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:39:38