Ansible:任务名称中的变量插值
我无法在Ansible 1.8.3中使用这个看似简单的示例。变量插值不会在任务名称中生效。我所看到的一切似乎都表明这应该有效。假设变量是在vars部分定义的,我希望任务名称打印变量的值。为什么这样不行 甚至Ansible中的示例似乎也没有打印变量值Ansible:任务名称中的变量插值,ansible,ansible-playbook,Ansible,Ansible Playbook,我无法在Ansible 1.8.3中使用这个看似简单的示例。变量插值不会在任务名称中生效。我所看到的一切似乎都表明这应该有效。假设变量是在vars部分定义的,我希望任务名称打印变量的值。为什么这样不行 甚至Ansible中的示例似乎也没有打印变量值 --- - hosts: 127.0.0.1 gather_facts: no vars: vhost: "foo" tasks: - name: create a virtual host file for {{ vho
---
- hosts: 127.0.0.1
gather_facts: no
vars:
vhost: "foo"
tasks:
- name: create a virtual host file for {{ vhost }}
debug: msg="{{ vhost }}"
这将产生以下输出:
PLAY [127.0.0.1]
**************************************************************
TASK: [create a virtual host file for {{ vhost }}]
****************************
ok: [127.0.0.1] => {
"msg": "foo"
}
PLAY RECAP
********************************************************************
127.0.0.1 : ok=1 changed=0 unreachable=0 failed=0
TASK [install : Changing password for user linux to LiNuXuSeRPaSs#]
更新
这适用于1.7.2,但不适用于1.8.3。因此,这要么是一个bug,要么是一个特性。变量在
名称中没有解析。仅在实际任务/条件等内部。占位符将被解析。我想这是故意的。假设您有一个带有_items
循环的,并在名称
中使用{{{item}}
。任务name
将只打印一次,但是{{{item}}
将在每次迭代中更改
我看到这些示例,即使是链接到的文档中的示例,也在名称中使用变量。但这并不意味着结果会像你预期的那样。文档由社区管理。可能有人只是把这一行放在那里,而没有对它进行测试——或者可能它以前在Ansible的早期版本中是这样工作的,文档当时还没有更新。(大约一年前我才开始使用Ansible)。但是,即使它不能像我们希望的那样工作,我仍然在我的名称中使用变量,只是为了表明任务是基于动态参数的。这些例子可能是出于同样的目的而写的
我最近做了一个有趣的观察(Ansible 1.9.4),默认值写在任务名称中
- name: create a virtual host file for {{ vhost | default("foo") }}
执行时,Ansible会将任务标题显示为:
任务:[为foo创建虚拟主机文件]
这样可以避免输出中出现难看的任务名称。解释
变量是否被插值取决于它被声明的位置
假设您有两台主机:A
和B
- 如果变量
foo
仅具有每主机值,则Ansible在运行播放时无法决定使用哪个值
- 另一方面,如果它有一个全局值(在主机不变性的意义上是全局的),那么使用哪个值就不会有任何混淆
资料来源:
实践手册
ansible\u user
是一个库存变量
问候语
是一个不变变量
今天在我的一个助理角色中,我遇到了同样的问题,我注意到了一些有趣的事情。
当我在使用任务名称中的变量之前使用set_fact模块时,它们实际上被转换为正确的值
在本例中,我想为远程用户设置密码:
注意,我使用了前面设置为事实的varstest\u user
和user\u password
- name: Prepare to set user password
set_fact:
user_password: "{{ linux_pass }}"
user_salt: "s0m3s4lt"
test_user: "{{ ansible_user }}"
- name: "Changing password for user {{ test_user }} to {{ user_password }}"
user:
name: "{{ ansible_user }}"
password: "{{ user_password | password_hash('sha512', user_salt) }}"
state: present
shell: /bin/bash
update_password: always
这为我提供了以下输出:
PLAY [127.0.0.1]
**************************************************************
TASK: [create a virtual host file for {{ vhost }}]
****************************
ok: [127.0.0.1] => {
"msg": "foo"
}
PLAY RECAP
********************************************************************
127.0.0.1 : ok=1 changed=0 unreachable=0 failed=0
TASK [install : Changing password for user linux to LiNuXuSeRPaSs#]
这就解决了我的问题。那有点。。。有道理。正如您所设想的,它曾经在1.7.x中工作,但在1.8中停止工作。哦,好吧……啊,谢谢你提到这些版本,我想这是因为我把我的任务变成了一个模块,因为我更新了Ansible,所以我的名字停止了插值。我正在使用一种变通方法,不知道这是否是唯一的方法。。我在任务之前包含调试语句这被确认为可能的缺陷-