1

我在ansible中有以下json输出:

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

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

输出应该是:

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

代码和结果:

Ansible 代码

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 和其他方式。仍然失败。

任何想法都非常感谢!

4

2 回答 2

5

正如@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在 var 中写你的,你可以这样引用它:

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

但我会建议,把它放在一个 var.

于 2018-12-04T17:41:25.653 回答
0

感谢您的所有回答。

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

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

于 2018-12-05T09:40:47.817 回答