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

Ansible检查JSON中非0 exit code触发任务失败的问题排查

原有代码失效原因
  • 变量引用错误:执行from_json解析后,jsondata已经是结构化字典对象,后续再访问jsondata.stdout属于无效引用,解析后的字典不存在stdout属性。
  • 语法使用错误:failed_when本身就是Jinja2原生执行环境,条件外层不需要套{{ }};另外json_query基于JMESPath语法,带空格的键名、比较值都需要按规范转义,原写法的查询语句完全不符合JMESPath规则。
  • 逻辑设计问题:用字符串搜索匹配Terminated不够严谨,存在正常退出(exit code为0)的Terminated状态应用时会出现误判,直接基于结构化数据做条件筛选更准确。
正确实现代码
- name: 获取JSON文件内容
  command: cat test.json
  register: result
  changed_when: false

- name: 将JSON内容解析为结构化变量
  set_fact:
    jsondata: "{{ result.stdout | from_json }}"

- name: 校验退出码,存在非0值时触发失败
  vars:
    # JMESPath查询:提取所有exit code非0的应用条目
    abnormal_apps: "{{ jsondata | json_query('domains.*[?`exit code` != `0`]') }}"
  debug:
    msg: "检测到异常退出应用,非0退出码列表:{{ abnormal_apps | map(attribute='exit code') | list }}"
  failed_when: abnormal_apps | length > 0

如果你需要直接获取异常应用的名称,可以调整JMESPath查询语句,直接返回异常应用名列表:

vars:
  abnormal_app_names: "{{ jsondata | json_query('domains | items(@) | [?value.\"exit code\" != `0`].key') }}"

调整后abnormal_app_names会直接返回类似['app2']的结果,判断列表长度大于0即可触发失败,输出信息更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:40:00