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

如何用jq将API返回JSON转换为Ansible Inventory所需格式?

将API返回的JSON转换为Ansible Inventory格式的jq解决方案

问题描述

我从API获取了一段JSON数据,需要用jq将其转换为Ansible Inventory脚本要求的格式。原始数据结构包含results数组,每个数组元素是带有name等字段的主机对象;目标格式要求把所有主机数据统一放在_meta的hostvars下,以主机名作为键。

我之前尝试的jq命令会重复生成_meta结构,另外还希望去除输出中重复的name字段,求可行的解决办法。

解决方案

核心思路

先把results数组里的每个主机对象转成「主机名: 移除name字段后的主机数据」的键值对,再统一构建包含_meta.hostvars的顶层结构,从根源避免_meta重复生成的问题,同时用del()方法去掉冗余的name字段。

具体jq命令

假设你的原始JSON示例如下:

{
  "results": [
    {
      "name": "web01",
      "ansible_host": "10.0.0.10",
      "role": "web_server"
    },
    {
      "name": "db01",
      "ansible_host": "10.0.0.20",
      "role": "database_server"
    }
  ]
}

执行以下jq命令即可完成转换:

jq '{ _meta: { hostvars: [ .results[] | { (.name): del(.name) } ] | add } }' input.json

命令拆解

  • .results[]:遍历results数组中的每一个主机对象
  • { (.name): del(.name) }:用当前主机的name值作为键,值为移除name字段后的主机数据(彻底消除重复的name字段)
  • [ ... ] | add:把所有单个的键值对对象合并成一个大对象,确保所有主机数据都集中在同一个结构里
  • 外层{ _meta: { hostvars: ... } }:构建Ansible Inventory要求的顶层结构,保证_meta只生成一次

最终输出

执行后会得到完全符合要求的格式:

{
  "_meta": {
    "hostvars": {
      "web01": {
        "ansible_host": "10.0.0.10",
        "role": "web_server"
      },
      "db01": {
        "ansible_host": "10.0.0.20",
        "role": "database_server"
      }
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:09:18