如何用Jinja/Ansible过滤器为嵌套字典批量合并默认参数?
在Ansible嵌套字典中批量合并默认值的简洁实现
需要在Ansible变量文件内,将公共默认字典合并到嵌套字典的每个子项中,替代现有Jinja循环写法,用更简洁的过滤器组合实现。一维字典可使用combine,但嵌套场景需要批量处理每个子字典。
解决方案
借助dict2items、map和items2dict三个过滤器的组合,无需编写Jinja循环即可实现需求:
修改variables.yaml中的example变量定义:
--- example_base: alice: foo: 1 bob: bar: 2 example_defaults: baz: 3 foo: 0 example: "{{ example_base | dict2items | map('combine', example_defaults, attribute='value', recursive=true) | items2dict }}"
过滤器作用说明
dict2items:将原始嵌套字典转换为键值对列表,格式为[{key: "alice", value: {foo:1}}, {key: "bob", value: {bar:2}}],让map可以遍历处理每个子项map('combine', example_defaults, attribute='value', recursive=true):对列表中的每个元素,取出value字段(即子字典),和example_defaults执行合并,recursive=true确保深层键也能正确覆盖(适用于多层嵌套场景)items2dict:将处理后的键值对列表重新转换回字典格式
验证效果
运行你提供的playbook.yaml后,输出结果与预期完全一致:
ok: [localhost] => { "msg": { "alice": { "baz": 3, "foo": 1 }, "bob": { "bar": 2, "baz": 3, "foo": 0 } } }
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

