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

如何用Ansible将字典id转为IP列表键并去除key/value字段?

需求与问题

我有如下字典列表:

"some_dict": [
    {
        "ips": [
            "10.10.11.20",
            "10.10.11.21"
        ],
        "id": "11111aaaaa"
    },
    {
        "ips": [
            "10.10.11.22",
            "10.10.11.23"
        ],
        "id": "22222bbbbb"
    },
    {
        "ips": [
            "10.10.11.25",
            "10.10.11.24"
        ],
        "id": "33333ccccc"
    },
    {
        "ips": [
            "10.10.11.26",
            "10.10.11.27"
        ],
        "id": "44444ddddd"
    }
]

需要将其重构为每个元素以id值为键、对应ips列表为值的字典,目标格式如下:

"some_dict": [
    {
        "11111aaaaa": [
            "10.10.11.20",
            "10.10.11.21"
        ]
    },
    {
        "22222bbbbb": [
            "10.10.11.22",
            "10.10.11.23"
        ]
    },
    {
        "33333ccccc": [
            "10.10.11.25",
            "10.10.11.24"
        ]
    },
    {
        "44444ddddd": [
            "10.10.11.26",
            "10.10.11.27"
        ]
    }
]

我尝试用json_query和JMESPath实现,代码如下:

- name: do something good
  set_fact:
    something_good: "{{ dict(some_dict|json_query(member_id_local_ips)) }}"
  vars:
    member_id_local_ips: >
      [].[member_id,local_ip|[]]
- debug: var=something_good|dict2items

得到的结果包含key和value字段,不符合目标格式:

"something_good|dict2items": [
    {
        "key": "11111aaaaa",
        "value": [
            "10.10.11.20",
            "10.10.11.21"
        ]
    },
    {
        "key": "22222bbbbb",
        "value": [
            "10.10.11.22",
            "10.10.11.23"
        ]
    },
    {
        "key": "33333ccccc",
        "value": [
            "10.10.11.25",
            "10.10.11.24"
        ]
    },
    {
        "key": "44444ddddd",
        "value": [
            "10.10.11.26",
            "10.10.11.27"
        ]
    }
]

需要去掉结果中的key和value字段,得到目标格式。

解决方案

可以通过JMESPath的计算键语法直接生成目标结构,无需先转字典再处理。修改后的Playbook如下:

- name: 生成目标格式数据
  set_fact:
    something_good: "{{ some_dict | json_query('[].{[id]: ips}') }}"

- debug: var=something_good

关键说明

  • JMESPath表达式[].{[id]: ips}的作用:
    • [] 遍历原列表的所有元素
    • {[id]: ips} 使用元素的id值作为动态键,ips列表作为对应的值,这里的[id]是JMESPath的计算键语法,支持用字段值作为字典键。
  • 另外你之前的表达式里用了member_id和local_ip,但原数据字段是id和ips,这也是需要修正的错误点。

执行后得到的结果完全符合目标格式:

"something_good": [
    {
        "11111aaaaa": [
            "10.10.11.20",
            "10.10.11.21"
        ]
    },
    {
        "22222bbbbb": [
            "10.10.11.22",
            "10.10.11.23"
        ]
    },
    {
        "33333ccccc": [
            "10.10.11.25",
            "10.10.11.24"
        ]
    },
    {
        "44444ddddd": [
            "10.10.11.26",
            "10.10.11.27"
        ]
    }
]

内容的提问来源于stack exchange,提问作者piercjs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:55:01