Ansible中如何将字典列表转换为值为列表的单字典?
将字典列表按层级分组为目标字典
我有如下字典列表 scott_adams_list:
"scott_adams_list": [ { "name": "Pointy-haired-Boss", "level": "Management" }, { "name": "Dogbert", "level": "Management" }, { "name": "Mega-Boss", "level": "Management" }, { "name": "Dilbert", "level": "Staff" }, { "name": "Wally", "level": "Staff" }, { "name": "Alice", "level": "Staff" }, { "name": "Asok", "level": "Staff" } ]
想要转换成如下结构的字典 scott_adams_dict:
"scott_adams_dict": { "Management": ["Pointy-haired-Boss", "Dogbert", "Mega-Boss"], "Staff": ["Dilbert", "Wally", "Alice", "Asok"] }
错误尝试
我试过以下Ansible任务:
- name: create single dictionary set_fact: dilbert: "{{ dict(scott_adams_list | json_query(dilbert_query)) }}" vars: dilbert_query: > [].[ ds_type, ds_id ]
但仅返回每个level对应的第一个元素:
"dilbert": { "Management": "Pointy-haired-Boss", "Staff": "Dilbert" }
之后尝试循环遍历列表元素,却出现报错:
- name: create single dictionary set_fact: dilbert: "{{ dict(scott_adams_list | json_query(dilbert_query)) }}" vars: dilbert_query: > [].[ item.ds_type, item.ds_id ] loop: "{{ scott_adams_list }}"
正确实现方法
你可以通过Ansible的groupby过滤器结合后续转换,或者直接用json_query的分组语法来实现需求,以下是几种可行方案:
方案1:简洁的单步实现
- name: 按level分组生成目标字典 set_fact: scott_adams_dict: > {{ scott_adams_list | groupby('level') | items2dict(key_name=0, value_name=1) | json_query('*.*.name') }}
方案2:分步实现(更直观)
- name: 先按level分组 set_fact: grouped_data: "{{ scott_adams_list | groupby('level') }}" - name: 转换为目标字典格式 set_fact: scott_adams_dict: "{{ scott_adams_dict | default({}) | combine({ item.0: item.1 | map(attribute='name') | list }) }}" loop: "{{ grouped_data }}"
方案3:使用json_query分组语法
- name: 用json_query直接分组 set_fact: scott_adams_dict: "{{ scott_adams_list | json_query('group_by(level).*.name') }}"
以上三种方法都能生成你需要的scott_adams_dict结构,其中方案1最简洁,方案2适合理解分组的完整过程。
内容的提问来源于stack exchange,提问作者piercjs
相关产品推荐
相关产品推荐

