如何将Ansible即席命令的输出转为JSON、CSV等格式?
嗨,我来给你梳理几种把Ansible ad-hoc命令输出转成JSON、CSV等常用格式的实用方法,都是日常运维里高频用到的技巧:
1. 直接输出为JSON格式
Ansible本身就支持原生JSON输出,这是最省心的方式。你只需要在ad-hoc命令末尾加上--format json参数(也可以简写为-f json),就能直接得到标准的JSON结构输出。
举个例子,获取所有主机的ping结果并保存为JSON:
ansible all -m ping --format json > ping_results.json
如果是执行shell命令,比如查看所有web服务器的uptime:
ansible web_servers -m shell -a 'uptime' --format json > web_uptime.json
这种方式输出的JSON可以直接被其他工具(比如jq、Python脚本)解析,非常适合自动化流程。
2. 转换为CSV格式
CSV格式适合做报表或者导入Excel,通常需要先把ad-hoc输出转成JSON,再用jq工具提取字段生成CSV。
示例1:导出主机名和IP地址
先获取包含主机信息的JSON:
ansible all -m setup -a 'filter=ansible_hostname,ansible_default_ipv4.address' --format json > host_details.json
然后用jq解析并生成CSV:
jq -r 'to_entries[] | [.key, .value.ansible_facts.ansible_hostname, .value.ansible_facts.ansible_default_ipv4.address] | @csv' host_details.json > host_details.csv
解释下这个jq命令:
to_entries[]把JSON对象转成键值对数组,每个键就是主机名[.key, ...]提取我们需要的字段(主机名、hostname、IP)@csv把数组转换成CSV格式,-r确保输出是原始字符串(不带多余引号)
示例2:导出磁盘使用率
如果是shell命令的输出,比如查看根目录磁盘使用:
ansible all -m shell -a 'df -P / | awk '\''NR==2 {print $5}'\''' --format json > disk_usage.json
再转成CSV:
jq -r 'to_entries[] | [.key, .value.stdout] | @csv' disk_usage.json > disk_usage.csv
3. 输出为YAML格式
YAML比JSON更易读,适合用来保存配置类的输出,同样用--format参数指定:
ansible all -m setup -a 'filter=ansible_distribution*' --format yaml > os_details.yaml
输出的YAML结构清晰,手动查看或者导入配置管理工具都很方便。
4. 自定义格式(表格/纯文本)
如果需要更灵活的格式,可以用awk、sed这类工具直接处理Ansible的默认人类可读输出。比如从uptime结果中提取主机和负载平均值:
ansible all -m shell -a 'uptime' | awk '/SUCCESS/{host=$1} /load average/{print host "," substr($10, 1, length($10)-1)}' > load_avg.csv
这个命令会过滤出主机名和负载值,生成简洁的CSV。
一些小提示
- 建议安装
jq工具(大多数Linux发行版都能通过包管理器安装,比如apt install jq),处理JSON效率极高 - 执行shell命令时,尽量用POSIX兼容的参数(比如
df -P),避免不同系统输出格式不一致导致解析失败 - 如果需要复杂的转换逻辑,也可以把JSON输出导入Python脚本,用
json模块解析后生成你需要的任何格式
内容的提问来源于stack exchange,提问作者Rajesh Yidi
相关产品推荐
相关产品推荐

