Как перебрать цикл в ansible и выполнить последующую задачу, когда условие совпадает для каждого элемента, если найдено

#ansible

#ansible

Вопрос:

У меня есть вариант использования, когда в vars /main.yaml я определил серверный элемент, как показано ниже, и он динамический, иногда у vars будет 3 сервера, иногда их будет 4 и так далее:

 server_name:
  - server1
  - server2
  - server3
 

У меня есть задача, которая генерирует выходные данные в виде списка некоторого сервера после извлечения сервера из внутренних элементов loadbalancer, как показано ниже:

     "ansible_facts": {
        "server_and_its_status": [
            "server1",
            "server1"
        ]
    },
 

Я хочу перебрать каждый сервер из vars /main.yaml со списком серверов, созданных в рамках задач.
Если сервер найден, я хочу выполнить некоторую последующую задачу, а затем перейти к следующему серверу в vars / main.yaml и повторить, если сервер найден в списке серверов, сгенерированных выводом задачи.
Я попробовал приведенный ниже код, который мне не помог :

     - name: Get the server details only for servers
      set_fact:
        server_and_its_status: "{{ jsondata1 | json_query('data.member[].nodes[].name') }}"

    - name: check if server is in list or not
      debug:
        msg: server {{ server_name }} found in list of servers generated by set_fact task 
      loop: "{{ server_name }}"
      loop: "{{ server_and_its_status  }}"
      when: item == server_name
 

Пожалуйста, предложите..

Ответ №1:

Поскольку вы хотите выполнить итерацию по servers списку, вам нужно только loop с ним. Нет необходимости выполнять цикл с. server_and_its_status Существуют тесты, такие как contains или in , чтобы проверить, присутствует ли определенный текст в элементах списка.

Используя in , например:

     - name: check if server is in list or not
      debug:
        msg: "server {{ item }} found in list generated by set fact"
      loop: "{{ servers }}"
      when: item in server_and_its_status