如何用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
相关产品推荐
相关产品推荐

