Назад | Перейти на главную страницу

Как в Ansible использовать «in» для вложенных списков в переменной

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

Как это работает:

Вар:

architecture:
  WebSphere:
    block_was_cluster_1:
      - cell
      - cell2
    block_was_cluster_2:
      - cell3
      - cell4

И задача:

- name: Install
  hosts: "{{ hosts }}"
  roles:
     - { role: download, when: type in architecture.WebSphere.block_was_cluster_1 }

В этом случае роль будет запущена на серверах, где тип переменной = ячейка или ячейка2.

Вопрос в том, как мне установить условие, чтобы роль запускалась на всех серверах, где type = cell или cell2, или cell3, или cell4, то есть с учетом всех вложенных списков в «architecture.WebSphere»

Я пытался поставить условие:

when: type in architecture.WebSphere.items

Но это не работает

Вопрос: «Как мне установить условие, чтобы роль запускалась на всех серверах, где type = cell или cell2, или cell3, или cell4, то есть с учетом всех вложенных списков в« architecture.WebSphere »?»

A: Используйте json_query. Например

   - debug:
        msg: "{{ architecture.WebSphere|json_query('*')|flatten }}"
    - debug:
        msg: "{{ item }} is in the architecture"
      loop:
        - cell
        - cell4
        - cell9
      when: item in architecture.WebSphere|json_query('*')|flatten

дает

ok: [localhost] => {
    "msg": [
        "cell", 
        "cell2", 
        "cell3", 
        "cell4"
    ]
}

ok: [localhost] => (item=cell) => {
    "msg": "cell is in the architecture"
}
ok: [localhost] => (item=cell4) => {
    "msg": "cell4 is in the architecture"
}
skipping: [localhost] => (item=cell9)