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
关键细节说明
- 过滤空行:如果
stdout_lines包含空行,select()会自动剔除,避免拼接后JSON格式错误。 - JSONPath表达式:
[*]表示遍历所有作业对象,{新键名: 原字段名}用于自定义输出的键名(也可以直接用原字段名,比如[*].[name, entityFriendlyName, status]输出数组格式)。 - 格式校验:如果执行时报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
相关产品推荐
相关产品推荐

