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