Ansible-在一个又一个列表上循环



即使这个问题看起来很简单(我已经搜索和测试了很多(,我也不知道如何在一个任务中循环两个或多个ansible列表。

例如,一个非常简单的例子:

我的vars.yml:

list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6

我的任务:

task:
- name: Create basic directories if they do not exist
file:
path: "{{ DIRECTORY }}"
state: directory
loop: 
- "{{ list1 }}"
- "{{ list2 }}"
loop_control:
loop_var: DIRECTORY

显然,我可以在一个列表中的一个任务中创建所有这些,但我有ALOT要创建,因此我提出了问题。

提前感谢

例如,给定下面的列表

list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
list3:
- /tmp/dir1
- /tmp/dir4
- /tmp/dir9

创建这些列表的列表,然后展平并仅选择唯一项目,例如

list3: "{{ [list1, list2, list3]|flatten|unique }}"

可能会给出你想要的

list3:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
- /tmp/dir9

你可以在循环中使用它,当然是

task:
- name: Create basic directories if they do not exist
file:
path: "{{ DIRECTORY }}"
state: directory
loop: "{{ [list1, list2, list3]|flatten|unique }}"
loop_control:
loop_var: DIRECTORY

如果列表存储在文件中,情况会更简单,例如

shell> cat vars.yml
list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
list3:
- /tmp/dir1
- /tmp/dir4
- /tmp/dir9

将文件中的变量(列表(包括在字典中

- include_vars:
file: vars.yml
name: lists

这将创建字典列表

lists:
list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
list3:
- /tmp/dir1
- /tmp/dir4
- /tmp/dir9

然后,展平这些值并选择唯一的项目。下面的表达式在不明确知道列表的情况下创建了与以前相同的列表,即您可以保持代码不变,并仅更改文件vars.yml中的数据

list3: "{{ lists.values()|flatten|unique }}"

相关内容

  • 没有找到相关文章

最新更新