首页 > 解决方案 > Ansible 变量替换与任务委托相结合

问题描述

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

- 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

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

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

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

标签: ansibleansible-template

解决方案


答案很简单,只需使用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

推荐阅读