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
相关产品推荐
相关产品推荐

