如何在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
相关产品推荐
相关产品推荐

