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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:32:07