Ansible - 一个接一个地循环列表
Ansible - Looping on a list of lists one after another
即使这个问题看起来很简单(而且我一直在搜索和测试很多),我也无法弄清楚如何在单个任务中在 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
显然我可以在单个列表中的单个任务中创建所有这些,但我有很多要创建,因此我的问题。
提前致谢,
例如,给定以下列表
list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
list3:
- /tmp/dir1
- /tmp/dir4
- /tmp/dir9
创建这些列表的列表,然后仅 flatten them and select unique 项,例如
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
lists:
list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
list3:
- /tmp/dir1
- /tmp/dir4
- /tmp/dir9
然后,扁平化值和 select 个独特的项目。下面的表达式创建了与以前相同的列表,而无需明确知道列表,即您可以保持代码不变并更改文件中的数据 vars.yml only
list3: "{{ lists.values()|flatten|unique }}"
即使这个问题看起来很简单(而且我一直在搜索和测试很多),我也无法弄清楚如何在单个任务中在 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
显然我可以在单个列表中的单个任务中创建所有这些,但我有很多要创建,因此我的问题。
提前致谢,
例如,给定以下列表
list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
list3:
- /tmp/dir1
- /tmp/dir4
- /tmp/dir9
创建这些列表的列表,然后仅 flatten them and select unique 项,例如
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
lists:
list1:
- /tmp/dir1
- /tmp/dir2
- /tmp/dir3
list2:
- /tmp/dir4
- /tmp/dir5
- /tmp/dir6
list3:
- /tmp/dir1
- /tmp/dir4
- /tmp/dir9
然后,扁平化值和 select 个独特的项目。下面的表达式创建了与以前相同的列表,而无需明确知道列表,即您可以保持代码不变并更改文件中的数据 vars.yml only
list3: "{{ lists.values()|flatten|unique }}"