如何在Ansible中无需循环合并嵌套与普通字典列表
用Ansible单行过滤器合并嵌套与普通字典列表
输入数据
vars: nested: - nest1: - name: item1 info: foo - nest2: - name: item2 info: bar unnested: - name: item3 info: baz - name: item4 info: foobar
期望结果
all_items: [ {name: item1, info: foo}, {name: item2, info: bar}, {name: item3, info: baz}, {name: item4, info: foobar} ]
需求说明
不想通过循环嵌套项再追加的方式实现,希望用combine()、json_query或其他Ansible过滤器,在单行中直接创建新变量,无需循环任务。
解决方案
方案1:使用json_query过滤器
通过json_query提取嵌套结构中的所有子项,再与非嵌套列表拼接:
all_items: "{{ unnested + nested | json_query('[].*[]') }}"
- 解释:
nested | json_query('[].*[]')会遍历nested中的每个字典,取出所有键对应的列表元素,将嵌套结构直接扁平化。
方案2:使用map+flatten组合过滤器
先提取嵌套字典的值,再通过两层扁平化处理,最后合并列表:
all_items: "{{ unnested + nested | map(attribute='values') | flatten(levels=2) }}"
- 解释:
map(attribute='values')取出每个nest1/nest2对应的列表,得到[[[{...}]], [[{...}]]];flatten(levels=2)将两层嵌套展开为[{...}, {...}],再与unnested拼接得到最终结果。
内容的提问来源于stack exchange,提问作者anon_stackoverflock
相关产品推荐
相关产品推荐

