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

Ansible中如何从stdout_lines提取name等指定字段值?

解决Ansible提取JSON备份作业字段的问题

核心问题根源

你的stdout_lines是多行字符串数组(命令返回的每行内容拆分后的列表),并非已解析的JSON对象,直接用json_query会因为数据类型不匹配而失败。必须先将多行内容拼接为完整JSON字符串,再解析为可操作的数据结构,最后才能用json_query提取字段。

完整解决方案

步骤1:拼接并解析JSON

先把stdout_lines的所有行拼接成完整JSON字符串,再用from_json转换为Ansible可识别的列表/字典结构。

步骤2:用json_query提取目标字段

使用JSONPath表达式精准提取name、entityFriendlyName、status三个字段,还可以自定义输出的键名。

示例Ansible任务

- name: 提取备份作业关键字段
  set_fact:
    backup_jobs: >-
      {{ 
        stdout_lines 
        | select()  # 过滤空行(如果有的话)
        | join('')  # 拼接所有行成完整JSON字符串
        | from_json  # 解析为JSON对象
        | json_query('[*].{作业名称: name, 实体名称: entityFriendlyName, 运行状态: status}') 
      }}

- name: 验证提取结果
  debug:
    var: backup_jobs

关键细节说明

  1. 过滤空行:如果stdout_lines包含空行,select()会自动剔除,避免拼接后JSON格式错误。
  2. JSONPath表达式:[*]表示遍历所有作业对象,{新键名: 原字段名}用于自定义输出的键名(也可以直接用原字段名,比如[*].[name, entityFriendlyName, status]输出数组格式)。
  3. 格式校验:如果执行时报JSON解析错误,先通过debug输出拼接后的字符串,确认是否为合法JSON:
    - name: 检查拼接后的JSON字符串
      debug:
        msg: "{{ stdout_lines | select() | join('') }}"
    

期望输出示例

ok: [localhost] => {
    "backup_jobs": [
        {
            "作业名称": "daily_db_backup",
            "实体名称": "prod-db-01",
            "运行状态": "Success"
        },
        {
            "作业名称": "weekly_files_backup",
            "实体名称": "file-server-02",
            "运行状态": "Failed"
        }
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:50:39