Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does conditional "when: var | d()" mean in Ansible 2.5

Tags:

ansible

jinja2

I am unable to source from Ansible documents a clear meaning of a conditional such as when: var | d(). Is someone able give a clear explanation?

E.g. Below works whether inputing extra-var value from cli or defaulting to local ENV variable value:

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

But this fails:

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

What is when: my_var | d() exactly doing? How how does it interplay with the | default(false,true) part in the variable declaration?

like image 299
MichP Avatar asked Oct 15 '25 20:10

MichP


1 Answers

d is an alias to the default filter. It is a Jinja2 filter, so head for the Jinja2 docs. They work the same:

default(value, default_value=u'', boolean=False)

[ ]

Aliases: d


Regarding the problem you are facing, it is because Ansible processes a condition consisting of only a variable name differently from a more complex expression (which is passed directly to Jinja2/Python) (the actual code starts here):

  • If the my_var variable has a value of user01, the conditional will try to find a value of user01 variable and fail because it doesn't exist.

  • If you just add a logical conjunction (which in common sense is redundant), Ansible will process the whole expression differently and it will work:

      when: my_var and true
    

In your case using another default filter in the expression is also redundant, but it prevents Ansible from trying to resolve a "nested" variable value.

like image 185
techraf Avatar answered Oct 18 '25 05:10

techraf