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

我无法在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 {{ 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模块时,它们实际上被转换为正确的值

在本例中,我想为远程用户设置密码:
注意,我使用了前面设置为事实的vars
test\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,所以我的名字停止了插值。我正在使用一种变通方法,不知道这是否是唯一的方法。。我在任务之前包含调试语句这被确认为可能的缺陷-