包含的json格式查询

时间:2018-12-04 14:40:41

标签: json ansible json-query

我在ansible中有以下json输出:

[{
    "active_transaction": null,
    "cores": 4,
    "hostname": "alpha-auth-wb01"
},
{
    "active_transaction": null,
    "cores": 4,
    "hostname": "beta-auth-wb01"
}]

现在,我尝试过滤输出以仅显示主机名包含字母的输出。

输出应为:

[{
    "active_transaction": null,
    "cores": 4,
    "hostname": "alpha-auth-wb01"
}]

代码和结果:

Ansible code

jq: "[?contains(hostname, 'alpha')]"


fatal: [worker.domain]: FAILED! => {"msg": "JMESPathError in json_query filter plugin:\\nIn function contains(), invalid type for value: None, expected one of: ['array', 'string'], received: \\"null\\""}

还尝试添加from_json | to_json和另一种方法。仍然失败。

任何想法都值得赞赏!

2 个答案:

答案 0 :(得分:0)

正如@Matthew L Daniel所提到的,由于引用问题,您应该将查询存储在变量中。您的查询也不正确,对于您想要的。据我了解,您想选择所有元素,其中hostname包含字符串alpha。完整的解决方案如下:

---
- hosts: localhost
  gather_facts: False

  vars:
    jq: "[?contains(hostname, 'alpha')]"
    json: |
      [{
          "active_transaction": null,
          "cores": 4,
          "hostname": "alpha-auth-wb01"
      },
      {
          "active_transaction": null,
          "cores": 4,
          "hostname": "beta-auth-wb01"
      }]

  tasks:
  - name: DEBUG
    debug:
      msg: "{{ json | from_json | json_query(jq) }}"

如果您不想将json_query编写为变量,则可以这样引用:

"{{ json | json_query(\"[?contains(hostname, 'alpha')]\") }}"

但是我建议将其放入变量中。

答案 1 :(得分:-1)

感谢您的回答。

我犯了一个错误,并在错误的变量上使用查询。 h!

在vsdetails上使用建议的json_query var就像一个魅力。谢谢! :)