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

Ansible中如何将JSON查询结果转换为以node_name为顶层键的对象

Ansible实现节点列表转目标字典结构方案

两种实现方式,均不需要安装额外自定义插件:

适配现有json_query用法的简洁写法

你已经在使用json_query过滤器,可以直接在数据处理阶段调整输出结构,配合items2dict过滤器一步生成结果,不需要循环:

set_fact:
  # 先把每个节点转成key为节点名、value为剩余属性的结构,再直接转字典
  my_nodes_dict: "{{ my_nodes | map('json_query', '{"key": node_name, "value": {"node_id": node_id, "pod_id": pod_id}}') | items2dict }}"

这种写法适配Ansible 2.10及以上版本,逻辑清晰,和你现有代码的使用习惯一致。

全版本兼容的循环合并写法

如果你的Ansible版本低于2.10,或者更习惯用combine过滤器,可以通过循环逐次合并字典,这也是你之前使用combine时没有写对的正确用法:

set_fact:
  my_nodes_dict: "{{ my_nodes_dict | default({}) | combine({
    item.node_name: {
      'node_id': item.node_id,
      'pod_id': item.pod_id
    }
  }) }}"
loop: "{{ my_nodes }}"

之前combine没达到预期,是因为直接把整个列表传入了过滤器,combine的作用是合并多个字典,需要逐次传入单个节点对应的单键值对,才能累加出目标结构。

执行任意一种写法后,得到的my_nodes_dict结构完全匹配你的预期:

{
    "node01": {
        "node_id": "1",
        "pod_id": "1"
    },
    "node02": {
        "node_id": "2",
        "pod_id": "1"
    },
    "node03": {
        "node_id": "3",
        "pod_id": "1"
    }
}

内容的提问来源于stack exchange,提问作者O.K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:15:43