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

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创建一个虚拟主机文件]

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

  • 那有点......有道理.就像你提出的那样,这曾经在1.7.x中工作但在1.8中停止工作.那好吧... (2认同)
  • 我正在使用解决方法,不知道这是否是唯一的方法..我在任务之前包含调试语句 (2认同)

MrM*_*ros 10

解释

变量是否被插值取决于它的声明位置。

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

  • 如果变量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\n

在此示例中,我想为远程用户设置密码:
\n请注意,我使用了变量test_user并且user_password之前将其设置为事实。

\n\n
- 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

这给了我以下输出:

\n\n
TASK [install : Changing password for user linux to LiNuXuSeRPaSs#]\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以这解决了我的问题。

\n