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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:30:35