我无法在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。所以这是一个错误或一个功能。
答案 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 }}"
YAML语法要求如果您使用{{foo}}启动一个值,则引用整行,因为它要确保您没有尝试启动YAML字典。这在YAML Syntax页面上有所介绍。
答案 2 :(得分:0)
是否插入变量取决于变量的声明位置。
想象一下,您有两个主机:A
和B
。
foo
仅具有每个主机的值,那么当Ansible运行播放时,它无法决定使用哪个值。来源: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_user
和user_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#]
所以这解决了我的问题。