cal*_*shy 15 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 {{ vhost }}
debug: msg="{{ vhost }}"
Run Code Online (Sandbox Code Playgroud)
这导致以下输出:
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
Run Code Online (Sandbox Code Playgroud)
更新 适用于1.7.2,但不适用于1.8.3.所以这是一个错误或功能.
udo*_*dan 22
变量未在内部解析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") }}
Run Code Online (Sandbox Code Playgroud)
执行时,Ansible会将任务标题显示为:
任务:[为foo创建一个虚拟主机文件]
这样就可以避免输出中出现丑陋的任务名称.
MrM*_*ros 10
变量是否被插值取决于它的声明位置。
想象一下您有两个主机:A和B。
foo仅具有每个主机的值,则当 Ansible 运行该 play 时,它无法决定使用哪个值。来源: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
Run Code Online (Sandbox Code Playgroud)
小智 7
今天,我在 Ansible 角色之一中遇到了同样的问题,并且我注意到一些有趣的事情。
\n当我在任务名称中使用变量之前使用 set_fact 模块时,它们实际上会被转换为正确的值。
在此示例中,我想为远程用户设置密码:
\n请注意,我使用了变量test_user并且user_password之前将其设置为事实。
- name: Prepare to set user password\n set_fact:\n user_password: "{{ linux_pass }}"\n user_salt: "s0m3s4lt"\n test_user: "{{ ansible_user }}"\n\n- name: "Changing password for user {{ test_user }} to {{\xc2\xa0user_password }}"\n user:\n name: "{{ ansible_user }}"\n password: "{{ user_password | password_hash(\'sha512\', user_salt) }}"\n state: present\n shell: /bin/bash\n update_password: always\nRun Code Online (Sandbox Code Playgroud)\n\n这给了我以下输出:
\n\nTASK [install : Changing password for user linux to LiNuXuSeRPaSs#]\nRun Code Online (Sandbox Code Playgroud)\n\n所以这解决了我的问题。
\n