Ansible:如何将静态字典循环合并到动态字典列表中
解决Ansible中静态字典合并到动态字典列表每个元素的问题
问题分析
你提供的static是包含单个字典的列表,dynamic是字典列表,需要将static内的字典合并到dynamic的每一个元素中。之前的尝试要么未遍历整个列表,要么存在语法逻辑错误,核心问题是没正确结合列表遍历与字典合并操作。
正确实现方法
方法1:使用map过滤器(推荐,简洁高效)
利用Ansible的map过滤器对dynamic列表的每个元素批量应用combine合并操作:
- set_fact: combined: "{{ dynamic | map('combine', static.0) | list }}"
代码说明:
static.0:因为static是包含单个字典的列表,通过索引0取出里面的字典对象map('combine', static.0):对dynamic列表中的每一个字典元素,执行combine操作,合并static.0的键值对| list:将map返回的迭代器转换为列表,得到最终的合并结果
方法2:使用循环(适合需要额外逻辑的场景)
如果合并时需要添加其他自定义处理,可通过loop遍历dynamic逐步构建结果列表:
- set_fact: combined: "{{ combined | default([]) + [item | combine(static.0)] }}" loop: "{{ dynamic }}"
代码说明:
default([]):初始化combined为空列表,避免首次执行时变量未定义报错item | combine(static.0):将当前循环的dynamic元素与静态字典合并+ [ ... ]:将合并后的字典追加到combined列表中
验证结果
执行上述代码后,combined变量将生成你期望的结构:
"combined": [ { "item1": "abc", "item2": "def", "item3": "dkslks", "item4": "kkk", "item5": "aa", "item6": "aaa", "item7": "aaaa" }, { "item1": "abc", "item2": "def", "item3": "dkslks", "item4": "kkk", "item5": "bb", "item6": "bbb", "item7": "bbbb" }, { "item1": "abc", "item2": "def", "item3": "dkslks", "item4": "kkk", "item5": "cc", "item6": "ccc", "item7": "cccc" } ]
注意:你提供的原始JSON数据存在语法错误(
item7缺少闭合引号),实际使用时需修正,否则Ansible会解析失败。
内容的提问来源于stack exchange,提问作者LJS
相关产品推荐
相关产品推荐

