Ansible: зарегистрируйте переменную, когда значение JSON равно

Я вызываю веб-сервис и возвращаю JSON. Я хочу условно запустить последующую задачу в зависимости от того, найдено ли конкретное значение name.

Например, установите значение nameExists тогда и только тогда, когда массив values содержит поле name из myDemo. Таким образом, в этом случае nameExists будет определено:

...
"failed": false,
"json": {
  "values": [{
    "id": "1234",
    "name": "myDemo"
  },
  {
    "id": "6789",
    "name": "myDemo2"
  }]
},
"msg": "OK (100 bytes)"
...

Вот что я сейчас пытаюсь:

# Call API
- name: Call API
  uri:
    url: myURL
    method: POST
  register: apiCheckResult

- name: Debug Auto tags
  debug:
    msg: "{{ item.name }}"
  loop: "{{ apiCheckResult.json['values'] }}"
  when: item.name == "myDemo"
  register: tagExists

В некотором смысле это работает, но дает мне полный вывод JSON, все, что мне нужно, это true/false.

Я на правильном пути или есть лучший способ добиться этого?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
2 881
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы (обычно) не используете задачу debug для установки переменных. Вероятно, вы захотите использовать set_fact. Если я правильно понимаю ваш вопрос, вы хотите установить логическое значение tagExists в true, если один из элементов в списке values ответа API содержит namemyDemo. Это может выглядеть так:

- set_fact:
    tagExists: "{{ apiCheckResult.json|json_query('values[?name == `myDemo`]') }}"

«Но подождите!», — скажете вы, — «это не логическое значение!». Пока ты прав, можешь обращаться вроде вкл. Например, установив tagExists с помощью этой задачи, вы можете сделать это:

- debug:
    msg: "The tag exists!"
  when: tagExists

Это работает, потому что непустой список оценивается как значение true в логическом контексте (а пустой список оценивается как false). Приведенное выше выражение json_query возвращает непустой список, если есть совпадение, и пустой список в противном случае.

Если вы В самом деле хотите логическое значение, вы можете сделать это вместо этого:

- set_fact:
    tagExists: "{{ true if apiCheckResult.json|json_query('values[?name == `myDemo`]') else false }}"

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