Запрос в формате json содержит
У меня есть следующий вывод JSON в ANSIBLE:
[{
"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 и наоборот. Все еще не удается.
Любые идеи высоко ценится!
2 ответа
Как сказал @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')]\") }}"
Но я бы порекомендовал, чтобы положить его в вар.
Спасибо за все ваши ответы.
Я допустил ошибку и использовал запрос по неверной переменной. Doh!
Использование предложенного json_query var на vsdetails работало как шарм. Спасибо!:)