我在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"
}]
代码和结果:
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和另一种方法。仍然失败。
任何想法都值得赞赏!
答案 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就像一个魅力。谢谢! :)