如何在Ansible中遍历嵌套字典?具体场景求解
Ansible嵌套字典遍历问题解决方案
嘿,我来帮你搞定这个嵌套字典遍历的问题!咱们分两部分说,先讲通用思路,再针对你的具体场景给出纯Ansible的实现。
一、Ansible遍历嵌套字典的通用技巧
Ansible里处理嵌套字典,核心是用dict2items过滤器把字典转换成[{key: ..., value: ...}, ...]的列表结构,然后结合loop和subelements过滤器(或者嵌套的dict2items)来逐层拆解多层嵌套。这种方式完全基于Ansible内置过滤器,不需要额外写Python模块或者嵌套任务循环。
二、针对你的具体场景的实现
先回顾下你的变量结构:
vars: commands: group1: cmd1: run: foo cmd2: run: bar group2: cmd3: run: zoo
要得到你期望的格式,只需要用dict2items配合subelements就能实现,直接看代码:
- name: 遍历嵌套字典并输出目标格式 debug: msg: "{{ item.0.key }}, {{ item.1.key }}={{ item.1.value }}" loop: "{{ commands | dict2items | subelements('value', skip_missing=True) }}"
代码解释:
commands | dict2items:把外层的commands字典转换成键值对列表,每个元素是这样的结构:{key: 'group1', value: {'cmd1': {'run': 'foo'}, 'cmd2': {'run': 'bar'}}}subelements('value', skip_missing=True):对每个group对应的value(也就是cmd字典)做二次拆解,把它也转换成键值对列表,最终每个loop的item是一个元组:(group的键值对, cmd的键值对)- 输出格式拼接:通过
item.0.key拿到group名称,item.1.key拿到cmd名称,item.1.value拿到对应的run字典,组合成你要的字符串。
执行这个任务后,输出会和你期望的一致(注:你期望里的cmd4应该是笔误,实际会输出cmd3):
- group1, cmd1={'run': 'foo'} - group1, cmd2={'run': 'bar'} - group2, cmd3={'run': 'zoo'}
这个方案完全是纯Ansible过滤器实现,没有用到额外任务循环或Python模块,完美符合你的要求~
内容的提问来源于stack exchange,提问作者sorin
相关产品推荐
相关产品推荐

