On Sun, 16 May 2021 08:54:29 +0200
Vladimir Botka <vbo...@gmail.com> wrote:

> On Sat, 15 May 2021 16:55:24 -0700
> Scott Mcdermott <sc...@smemsh.net> wrote:
> 
> > Hello, why does short circuit only works for the first two cases:
> > 
> > - hosts: localhost
> >   become: false
> >   vars:
> >     ivar: '{{hostvars[inventory_hostname].dne}}'
> >   tasks:
> >     - debug:
> >         msg: "works: {{'foo' or dne}}"
> >     - debug:
> >         msg: "works: {{'bar' or hostvars[inventory_hostname].dne}}"
> >     - debug:
> >         msg: "fails: {{'baz' or ivar}}
> > 
> > The third debug will generate an error:
> > 
> >     The task includes an option with an undefined variable.
> >     The error was: {{hostvars[inventory_hostname].dne}}:
> >     'ansible.vars.hostvars.HostVarsVars object' has no attribute 'dne'
> > 
> > Why is it even looking up in hostvars at all? The non-empty
> > string should evaluate True, so why is it reading the ORed
> > condition?  The same thing happens with "if true else" and
> > ternary(true, ...) filter.  It seems that it's properly
> > short-circuiting in the first two cases, because the variable
> > "dne" does not exist, and there is no error.  Even more
> > confusing, the expansion of host vars is the exact same in cases
> > 2 and 3, it's only going through an indirect variable in case 3.
> > 
> > This seems to happen regardless of the source of variables ie
> > extra vars, vars_files, etc.
> > 
> > Is this a bug, or what am I missing?  
> 
> Why don't you start debugging the variable?
> 
>   - debug:
>       var: dne
> 
> See "Minimal working example"
> https://en.wikipedia.org/wiki/Minimal_working_example

If the variable *dne* is not defined the playbook

 shell> cat playbook.yml
 - hosts: localhost
   vars:
     ivar: "{{ hostvars[inventory_hostname].dne }}"
   tasks:
     - debug:
         var: ivar
     - debug:
         msg: "{{ 'foo' or dne }}"
     - debug:
         msg: "{{ 'foo' or ivar }}"

gives

 shell> ansible-playbook playbook.yml
 ...
 TASK [debug]
 *************************************************
 ok: [localhost] => ivar: VARIABLE IS NOT DEFINED!

 TASK [debug]
 *************************************************
 ok: [localhost] => msg: foo

 TASK [debug]
 *************************************************
 fatal: [localhost]: FAILED! => msg: |-
 ... The error was: 'dne' is undefined

In the second and third debug tasks, the expansion of the string "{{
... }}" is needed first. Then the *or* expression can be evaluated.
There is no problem in the second task because the variable *dne*
is neither expanded nor evaluated (the first element of the *or*
expression is True).

But, the third debug task fails because the expansion of the string
"{{ ... }}" fails before the *or* expression could be evaluated.
You'll need a default value if you want to use this kind of "lazy
evaluation" constructs, e.g.

 shell> cat group_vars/all.yml
 dne: False

-- 
Vladimir Botka

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ansible-project+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/20210516092259.16c39eec%40gmail.com.

Attachment: pgpnaZtt77HaG.pgp
Description: OpenPGP digital signature

Reply via email to