如何使用Ansible从AnsibleRunner执行Playbook的输出中提取JSON负载
解决方案
可以实现,以下是三种常用方案,可根据你的使用场景选择:
方案1:修改playbook直接输出纯JSON(无额外前缀)
如果你需要直接拿到纯净的JSON文件,无需解析命令行输出,可以用copy模块把变量直接写入本地文件:
tasks: - name: Get list of volumes # 注意:你原有写法中的`task: execute`不符合Ansible规范,需替换为实际调用的模块名,例如command、shell或对应厂商的阵列管理模块 <实际模块名>: execute register: volumes - name: 导出纯JSON到文件 copy: content: "{{ volumes | to_nice_json }}" dest: ./volumes_result.json
执行完成后打开volumes_result.json就是你需要的纯JSON负载,没有PLAY、TASK等额外前缀内容。
方案2:命令行执行时指定输出格式(无需修改playbook)
如果你不想改动现有playbook,执行时指定Ansible的stdout回调为JSON格式即可:
# 全量输出为JSON结构,你可以直接提取对应task的返回值 ANSIBLE_STDOUT_CALLBACK=json ansible-playbook 你的剧本文件名.yml -i 主机清单文件
如果只需要打印debug的变量内容,也可以配合参数关闭不必要的输出:
ANSIBLE_STDOUT_CALLBACK=minimal ANSIBLE_DISPLAY_SKIPPED_HOSTS=no ansible-playbook 你的剧本文件名.yml | grep -A 1000 '"volumes":' | head -n -1
方案3:Ansible Runner专属提取方法
如果你是在Python代码中调用Ansible Runner,可以直接从返回的事件对象中提取对应任务的返回值,完全不需要解析文本输出:
import json import ansible_runner # 执行playbook runner_result = ansible_runner.run( private_data_dir='你的工作目录路径', playbook='你的剧本文件名.yml' ) # 遍历事件提取目标任务的返回值 volumes_data = None for event in runner_result.events: if event['event'] == 'runner_on_ok' and event['event_data']['task'] == 'Get list of volumes': volumes_data = event['event_data']['res'] break # 输出纯JSON print(json.dumps(volumes_data, indent=2))
内容的提问来源于stack exchange,提问作者positron
相关产品推荐
相关产品推荐

