запрос в формате json содержит - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующий вывод 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 ]

0 голосов
/ 05 декабря 2018

Спасибо за все ваши ответы.

Я допустил ошибку и использовал запрос с неверной переменной.Doh!

Использование предложенной переменной json_query в vsdetails работает как шарм.Спасибо!:)

0 голосов
/ 04 декабря 2018

Как упоминал @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')]\") }}"

Но яРекомендую, чтобы положить его в var.

...