Ansible:任务名称中的变量插值

时间:2015-03-12 03:45:42

标签: ansible ansible-playbook

我无法在Ansible 1.8.3中使用这个看似简单的例子。变量插值不会引入任务名称。我见过的所有examples似乎都暗示这应该有效。鉴于变量是在vars部分中定义的,我期望任务名称打印变量的值。为什么这不起作用?

即使Ansible documentation中的示例似乎也不打印变量值。

---
- 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   

更新 这适用于1.7.2但不适用于1.8.3。所以这是一个错误或一个功能。

4 个答案:

答案 0 :(得分:20)

name内未解析变量。只有在实际任务/条件等内部才能解决占位符问题。我想这是设计的。假设您有一个with_items循环并使用{{ item }}中的name。任务name只会打印一次,但{{ item }}会在每次迭代中发生变化。

我看到示例,即使您链接到的文档中的示例,也使用name中的变量。但这并不意味着结果会像你预期的那样。这些文档是社区管理的。可能有人只是把那条线放在那里没有测试它 - 或者它曾经像以前版本的Ansible那样工作,然后文档还没有更新。 (我大约一年后才使用Ansible)。但即使它不像我们希望的那样工作,我仍然在name中使用变量,只是为了表明任务是基于动态参数。可能的例子都是以同样的意图写成的。

我最近做的一个有趣的观察(Ansible 1.9.4)是,默认值写在任务名称中。

- name: create a virtual host file for {{ vhost | default("foo") }}

执行时,Ansible会将任务标题显示为:

  

任务:[为foo创建虚拟主机文件]

这样就可以避免输出中出现丑陋的任务名称。

答案 1 :(得分:1)

您必须用引号将字符串括起来。

tasks:
    - name: "create a virtual host file for {{ vhost }}"
      debug: msg="{{ vhost }}"

来自ansible documentation

  

YAML语法要求如果您使用{{foo}}启动一个值,则引用整行,因为它要确保您没有尝试启动YAML字典。这在YAML Syntax页面上有所介绍。

答案 2 :(得分:0)

说明

是否插入变量取决于变量的声明位置。

想象一下,您有两个主机:AB

  • 如果变量foo仅具有每个主机的值,那么当Ansible运行播放时,它无法决定使用哪个值。
  • 另一方面,如果它具有 global 值(就主机不变性而言是全局值),则不会混淆要使用哪个值。

来源:https://github.com/ansible/ansible/issues/3103#issuecomment-18835432

动手手册

  • ansible_user是库存变量
  • greeting是一个不变变量
- name: Test variable substitution in names
  hosts: localhost
  connection: local
  vars:
    greeting: Hello
  tasks:
    - name: Sorry {{ ansible_user }}
      debug:
        msg: this won't work
    - name: You say '{{ greeting }}'
      debug:
        var: ansible_user

答案 3 :(得分:0)

我今天在Ansible角色中遇到了同样的问题,并且发现了一些有趣的事情。
在任务名称中使用var之前使用set_fact模块时,它们实际上会转换为正确的值。

在此示例中,我想为远程用户设置密码:
请注意,我使用了以前设置为事实的变量test_useruser_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

这给了我以下输出:

TASK [install : Changing password for user linux to LiNuXuSeRPaSs#]

所以这解决了我的问题。