如何在 Ansible 中循环多个依赖任务
How to loop multiple dependent task in Ansible
我正在尝试让 2 个任务使用相同的变量,但第二个任务依赖于第一个任务的结果。如果我使用 register 来记录第一个任务的结果,我最终会创建一个列表,第二个任务无法有效使用它,因为当我只希望项目在两个任务中都为 运行 时,它会创建多对多循环关系首先,然后是两个任务中 运行 的第二项,然后是第三项,依此类推。
例如,搜索目录是否存在,如果存在则更改其权限。我有一个目录列表来循环检查它们是否存在,然后更改这些权限。我如何在 Ansible 中将它循环到它只经过每个任务列表中的每个人?以下是我最后一次尝试。
- hosts: localhost
vars:
folders_to_change:
- /Users/Documents/test_folder1
- /Users/Documents/test_folder2
tasks:
- name: Ansible check file exists example.
stat:
path: "{{ item }}"
register: file_details
loop:
"{{ folders_to_change }}"
- name: Change permissions of folder
file:
path: "{{ folders_to_change[{{ item }}] }}"
owner: root
group: root
mode: 777
state: directory
when: file_details.stat.exists.isdir["{{ item }}"]
loop:
"{{ range(0 - folders_to_change|len }}"
你很接近,但你有一些东西放错了地方。
["{{ item }}"]
位于表达式的错误结尾,因为 isdir
只是一个属性,而不是列表,而 file_details.results
是一个 list
when: file_details.results[item].stat.isdir
也没有必要涉及 jinja2 胡须,因为 when:
已经是一个 jinja2 表达式,并且 肯定 不需要引用 int 作为 range
发出。
这将我们带到下一个项目:range
需要两个参数,但您指定了一个表达式 0 - len
,它的范围将超过负数。起始 0 是隐含的,所以真的只是省略它:
when: file_details.results[item].stat.isdir
loop:
"{{ range(folders_to_change|length) }}"
最后,如果您更喜欢那种不断使用 range
并更轻松地返回全局变量的风格,那么您的功能会更强大,但是 results
列表会跟踪原始 item
在其 dict
条目中键入,因此:
- name: Change permissions of folder
file:
path: "{{ item.item }}"
owner: root
group: root
mode: 777
state: directory
when: item.stat.isdir
loop: "{{ file_details.results }}"
您真的会受益于 debug: var=file_details
(或其他)的一些使用,以查看可供您使用的数据的形状
我正在尝试让 2 个任务使用相同的变量,但第二个任务依赖于第一个任务的结果。如果我使用 register 来记录第一个任务的结果,我最终会创建一个列表,第二个任务无法有效使用它,因为当我只希望项目在两个任务中都为 运行 时,它会创建多对多循环关系首先,然后是两个任务中 运行 的第二项,然后是第三项,依此类推。
例如,搜索目录是否存在,如果存在则更改其权限。我有一个目录列表来循环检查它们是否存在,然后更改这些权限。我如何在 Ansible 中将它循环到它只经过每个任务列表中的每个人?以下是我最后一次尝试。
- hosts: localhost
vars:
folders_to_change:
- /Users/Documents/test_folder1
- /Users/Documents/test_folder2
tasks:
- name: Ansible check file exists example.
stat:
path: "{{ item }}"
register: file_details
loop:
"{{ folders_to_change }}"
- name: Change permissions of folder
file:
path: "{{ folders_to_change[{{ item }}] }}"
owner: root
group: root
mode: 777
state: directory
when: file_details.stat.exists.isdir["{{ item }}"]
loop:
"{{ range(0 - folders_to_change|len }}"
你很接近,但你有一些东西放错了地方。
["{{ item }}"]
位于表达式的错误结尾,因为 isdir
只是一个属性,而不是列表,而 file_details.results
是一个 list
when: file_details.results[item].stat.isdir
也没有必要涉及 jinja2 胡须,因为 when:
已经是一个 jinja2 表达式,并且 肯定 不需要引用 int 作为 range
发出。
这将我们带到下一个项目:range
需要两个参数,但您指定了一个表达式 0 - len
,它的范围将超过负数。起始 0 是隐含的,所以真的只是省略它:
when: file_details.results[item].stat.isdir
loop:
"{{ range(folders_to_change|length) }}"
最后,如果您更喜欢那种不断使用 range
并更轻松地返回全局变量的风格,那么您的功能会更强大,但是 results
列表会跟踪原始 item
在其 dict
条目中键入,因此:
- name: Change permissions of folder
file:
path: "{{ item.item }}"
owner: root
group: root
mode: 777
state: directory
when: item.stat.isdir
loop: "{{ file_details.results }}"
您真的会受益于 debug: var=file_details
(或其他)的一些使用,以查看可供您使用的数据的形状