Maybe it will facilitate understanding what's going on if we name things
what they really are:
---
- hosts: localhost
gather_facts: no
tasks:
- name: Strings in a loop are indeed defined
ignore_errors: true
assert:
that: item is defined
loop:
- RandomStringA
- RandomStringB
- ansible_forks
- name: Strings in a loop are unlikely to be variable names
ignore_errors: true
assert:
that: '{{ item }} is defined'
loop:
- UndefinedVariableNameA
- UndefinedVariableNameB
- ansible_forks
On 3/13/24 2:27 PM, rjwagn...@gmail.com wrote:
Hi all - I recently upgraded to Ansible core 2.15, and started hitting
"Conditional is marked as unsafe, and cannot be evaluated." As
discussed at
https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_9.html,
I removed templating from when and assert. All seemed fine, but then
I discovered loop variables don't appear to be interpolated in assert
without templating.
As an example, consider the following playbook that aims to confirm
two variables, varA and varB, are defined (in the sample output, they
are not defined):
#> cat b.yml
---
- hosts: localhost
gather_facts: no
tasks:
- name: without templating
assert:
that: item is defined
loop:
- varA
- varB
- name: with templating
assert:
that: '{{ item }} is defined'
loop:
- varA
- varB
#> ansible-playbook b.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available.
Note that the
implicit localhost does not match 'all'
PLAY [localhost]
**********************************************************************
TASK [without templating]
*************************************************************
ok: [localhost] => (item=varA) => {
"ansible_loop_var": "item",
"changed": false,
"item": "varA",
"msg": "All assertions passed"
}
ok: [localhost] => (item=varB) => {
"ansible_loop_var": "item",
"changed": false,
"item": "varB",
"msg": "All assertions passed"
}
TASK [with templating]
****************************************************************
failed: [localhost] (item=varA) => {
"ansible_loop_var": "item",
"assertion": "varA is defined",
"changed": false,
"evaluated_to": false,
"item": "varA",
"msg": "Assertion failed"
}
failed: [localhost] (item=varB) => {
"ansible_loop_var": "item",
"assertion": "varB is defined",
"changed": false,
"evaluated_to": false,
"item": "varB",
"msg": "Assertion failed"
}
Why is templating required to interpolate the loop variable but not
other (non loop) variables? Furthermore, is there a way to write this
task without templating and get the expected behavior?
Thanks
Rob
--
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/d23f849b-0342-47d8-b2f4-0f1634cdf866n%40googlegroups.com
<https://groups.google.com/d/msgid/ansible-project/d23f849b-0342-47d8-b2f4-0f1634cdf866n%40googlegroups.com?utm_medium=email&utm_source=footer>.
--
Todd
--
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/4ea45f07-c044-4b61-a244-e6f2d5980ed6%40gmail.com.