Запрос в формате 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"
}]

Код и результаты:

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 и наоборот. Все еще не удается.

Любые идеи высоко ценится!

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 работало как шарм. Спасибо!:)

Другие вопросы по тегам