Ansible 变量替换与任务委托相结合

Ansible variable substitution in combination with task delegation

我运行遇到了一个问题,即在委托给另一台主机的后续任务中错误地替换了已注册的变量。这是我的剧本的精简版:

- hosts: all
  name: Test Play
  gather_facts: false

  tasks:
      - name: Create output directory
        tempfile:
            state: directory
            suffix: diag
        register: output_dir

      - name: Create API resources directory
        file:
            path: "{{ output_dir.path }}/api-resources"
            state: directory
        delegate_to: "{{groups['control-plane'][0]}}"
        run_once: yes
        register: api_resources_dir

现在每个主机都会创建一个临时目录,但只有我的一个主机会在该临时目录内另外创建另一个目录。但是,当此剧本为 运行 时,第二个任务委托给的主机最终会出现两个不同的临时目录,其中一个包含 api-resources 目录。后者位于与委托主机同名的临时目录中。

我怀疑第二个任务中的变量 {{ output_dir.path }} 在委托主机上被替换,然后任务才被委托,而我会假设变量被替换为主机的值任务委托给。

如何在这种情况下正确使用 output_dir 变量,以便 api-resources 目录最终位于第一个任务中创建的临时目录目录中?

答案很简单,用when代替delegate_to即可:

- hosts: all
  name: Test Play
  gather_facts: false

  tasks:
      - name: Create output directory
        tempfile:
            state: directory
            suffix: diag
        register: output_dir

      - name: Create API resources directory
        file:
            path: "{{ output_dir.path }}/api-resources"
            state: directory
        when: inventory_hostname == groups['control-plane'][0]
        register: api_resources_dir