在 Ansible 中,如何使用“in”来表示变量中的嵌套列表

在 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 }

在这种情况下,角色将在变量类型 = cell 或 cell2 的服务器上启动。

问题是,我如何设置条件以便角色在所有类型 = cell 或 cell2 或 cell3 或 cell4 的服务器上启动,也就是说,考虑“architecture.WebSphere”中的所有嵌套列表

我试图提出一个条件:

when: type in architecture.WebSphere.items

但它不起作用

答案1

问:“我如何设置条件,以便角色在所有类型 = cell 或 cell2 或 cell3 或 cell4 的服务器上启动,也就是说,考虑‘architecture.WebSphere’中的所有嵌套列表?”

答:使用json_查询。 例如

   - 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)

相关内容