如何在 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(或其他)的一些使用,以查看可供您使用的数据的形状