我需要判断下面的JSON文件中是否有0以外的退出代码.

{
    "domains": {
        "app1": {
            "status": "Running"
        },
        "app2": {
            "status": "Terminated",
            "exit code": 2
        },
        "app3": {
            "status": "Running"
        },
        "app4": {
            "status": "Running"
        },
        "app5": {
            "status": "Terminated",
            "exit code": 0
        }
    }
}

找到0以外的退出代码后,我希望Ansible任务失败.我try 了以下代码:

- name: Execute command to obtain json list.
  command: cat test.json
  register: result

- name: save the Json data to a Variable as a Fact
  set_fact:
     jsondata: "{{ result.stdout | from_json }}"

- name: Find string
  when: jsondata.stdout is search('Terminated')
  debug:
     msg: "{{ jsondata.stdout }}"
  failed_when: "{{ jsondata.stdout | jsonquery(domains.*[exit code] != 0) }}"

但是,这似乎不起作用.

推荐答案

您的故障状态中确实存在多个问题:

  1. when及其*_when个派生词永远不应该被模板化,所以应该go 掉表达式分隔符{{ ... }}
  2. 您正在jsondata事实上使用属性stdout,但该属性没有
  3. 过滤器名称是json_query,而不是jsonquery
  4. 您必须引用传递给过滤器的JMESPath查询:json_query('my_query_here_quoted')
  5. 因为您正在使用.*进行投影,所以必须重置它才能进行后续的过滤器投影:domains.* | [?my_condition]
  6. 由于数组键包含空格,因此必须对其进行双引号:
  7. 因为您的条件是一个整数,所以必须将其放在反勾号中.此外,你的情况必须放在括号内,并以一个问号开始:[?"exit code" == `0`]
  8. 为了消除根本没有退出代码的元素,一个更简单的解决方案是执行大于:[?"exit code" > `0`]
  9. 有一个fail任务,它可能比debugfailed_when更适合你的情况

完成所有这些之后,您应该以以下任务结束:

- name: Fail when we have an abnormal exit status
  fail:
    msg: |-
      Some process have an abnormal exit:
      {{ _abnormal_exit }}  
  when: _abnormal_exit | length > 0
  vars:
    _abnormal_exit: >-
      {{
        jsondata | json_query('domains.* | [?"exit code" > `0`]')
      }}

考虑到这两项任务:

- name: Get content of test.json
  command: cat test.json
  register: result

- name: Fail when we have an abnormal exit status
  fail:
    msg: |-
      Some process have an abnormal exit:
      {{ _abnormal_exit }}  
  when: _abnormal_exit | length > 0
  vars:
    _abnormal_exit: >-
      {{
        result.stdout
        | from_json
        | json_query('domains.* | [?"exit code" > `0`]')
      }}

它将产生:

TASK [Get content of test.json] *****************************************
changed: [localhost]

TASK [Fail when we have an abnormal exit status] ************************
fatal: [localhost]: FAILED! => changed=false 
  msg: |-
    Some process have an abnormal exit:
    [{'status': 'Terminated', 'exit code': 2}]

Json相关问答推荐

使用jolt删除空对象

在T—SQL中将STR_AGG与JSON_ARRAY结合起来

Jolt将键和值转换为单独的数组集

如何使用JQ将JSON字符串替换为解析后的类似功能?

如何创建生成两个不同对象的JSON数组的SQL查询?

使用json_query更新事实

Postgres Select json数组并重新映射属性名称

如何在JSONata对象中迭代并向数组添加新字段?

使用动态语言jQuery:根据匹配模式提取与其他值匹配的值

如何使用nifi从json文件中过滤属性

如何加入或合并列表元素列表(未知长度)

jolt 通配符如何用于 RHS?

使用 jq Select 键:值并输出为数组

Angular 2/Web Api - json 解析错误语法错误意外结束输入

应该使用什么标头将 GZIP 压缩 JSON 从 Android 客户端发送到服务器?

在 Qt 4.7 中解析 JSON 的最简单方法

如何从 JSON 响应中提取单个值?

如何从 MVC 控制器返回 Json 对象以查看

ASP.NET Web API JSON 输出中没有时间的日期

如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET?