ansible - 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
目录最终位于第一个任务中创建的临时目录目录中?
解决方案
答案很简单,只需使用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
推荐阅读
- python-3.x - 如何使用已经在 tsv 文件中的位置从序列中提取子字符串
- ios - 线程 17:EXC_BAD_INSTRUCTION 代码=EXC_1386_INVOP,子代码=0x0)
- javascript - 没有 CSS 和只有 JS 的手机和平板电脑的显示元素
- aws-lambda - 我想使用 python lamda 函数从事件日志中选择文件名
- operating-system - 为什么程序在内存而不是硬盘上执行?
- php - 即使使用 cookie 传输,Codeigniter Ajax 请求中也禁止 403
- xamarin - 如何显示所有页面通用的导航栏“TitleView”
- java - 如何在 Spring Boot 中启用 H2 数据库服务器模式
- arrays - 无法使用 Java 解决 IntelliJ 中 JSONArray 的符号错误
- gridview - VerticalGridView的焦点处理