在Ansible 2.5中,条件“when:var | d()”的含义是什么

时间:2018-05-08 11:25:37

标签: ansible jinja2

我无法从Ansible文档中获取条件的明确含义,例如when: var | d()。有人能够给出明确的解释吗?

E.g。无论是从cli输入extra-var值还是默认为本地ENV变量值,

都可以实现
vars:
  my_var: "{{ e_var | default(ansible_env.USER | default(False,true)) }}"
tasks:
  - name: Conditional check
    debug:
      msg: "{{ my_var }}"
    when: my_var | d()

但这失败了:

vars:
  my_var: "{{ e_var | default(ansible_env.USER | default(false,true)) }}"
tasks:
  - name: Conditional check
    debug:
      msg: "{{ my_var }}"
    when: my_var

when: my_var | d()究竟在做什么?它如何与变量声明中的| default(false,true)部分相互作用?

1 个答案:

答案 0 :(得分:1)

ddefault过滤器的别名。它是一个Jinja2过滤器,所以前往the Jinja2 docs。他们的工作方式相同:

  

默认值,default_value = u'',布尔值=错误

     

[]

     

别名:d

关于你所面临的问题,这是因为Ansible处理的条件只包含一个变量名,而不是更复杂的表达式(直接传递给Jinja2 / Python)({{3 }}):

  • 如果my_var变量的值为user01,则条件将尝试查找值user01变量并失败,因为它不存在。

  • 如果你只是添加一个逻辑连接(通常意义上是冗余的),Ansible将以不同的方式处理整个表达式,它将起作用:

    when: my_var and true
    

在您的情况下,在表达式中使用另一个default过滤器也是多余的,但它会阻止Ansible尝试解析“嵌套”变量值。