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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:54:02