Hey Todd - apologies, I don't understand your comment.

Hey Walter - yes, you are correct.

To elaborate on the use case.  FIrst task in my playbooks confirms the user
provided all the expected/required variables.  I iterate over the list of
variables and make sure they are defined with assert.  The list of required
variables is provided as a list to "loop." Trouble I'm seeing is the items
in the loop (i.e., the variable names) are not being interpolated by assert
unless they are templated.

But if we ignore the loop for a second, and just pass a variable to assert,
it does get interpolated without templating:

#> cat c.yml
---
- hosts: localhost
  gather_facts: no
  tasks:
  - name: a defined variable
    assert:
      that: ansible_forks is defined
  - name: an undefined variable
    assert:
      that: varA is defined
#> ansible-playbook c.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 [a defined variable]
*************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [an undefined variable]
**********************************************************
fatal: [localhost]: FAILED! => {
    "assertion": "varA is defined",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}

So, it seems that assert interpolates (non-templated) variables unless that
variable is "item"

Rob

On Thu, Mar 14, 2024 at 7:48 AM 'Rowe, Walter P. (Fed)' via Ansible Project
<ansible-project@googlegroups.com> wrote:

> I sense that "with templating" does as expected?
>
> *% ansible --version*
>
> ansible [core 2.16.4]
>
>   config file = None
>
>   configured module search path =
> ['/Users/wrowe/.ansible/plugins/modules',
> '/usr/share/ansible/plugins/modules']
>
>   ansible python module location =
> /opt/homebrew/lib/python3.11/site-packages/ansible
>
>   ansible collection location =
> /Users/wrowe/.ansible/collections:/usr/share/ansible/collections
>
>   executable location = /opt/homebrew/bin/ansible
>
>   python version = 3.11.8 (main, Feb  6 2024, 21:21:21) [Clang 15.0.0
> (clang-1500.1.0.2.5)] (/opt/homebrew/opt/python@3.11/bin/python3.11)
>
>   jinja version = 3.1.3
>
>   libyaml = True
>
>
> *% ansible-playbook foo.yaml -i localhost,*
>
>
> 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"
>
> }
>
>
> PLAY RECAP
> *************************************************************************************************************
>
> localhost                  : ok=1    changed=0    unreachable=0    failed=1
>   skipped=0    rescued=0    ignored=0
>
> Walter
> --
> Walter Rowe, Division Chief
> Infrastructure Services Division
> Mobile: 202.355.4123
>
> On Mar 13, 2024, at 4:55 PM, Todd Lewis <uto...@gmail.com> wrote:
>
> 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
> <https://groups.google.com/d/msgid/ansible-project/4ea45f07-c044-4b61-a244-e6f2d5980ed6%40gmail.com?utm_medium=email&utm_source=footer>
> .
>
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "Ansible Project" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/ansible-project/fqqYt8AfU_o/unsubscribe.
> To unsubscribe from this group and all its topics, 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/A767305C-C137-4E0B-B1FD-DAAC2DDD32A6%40nist.gov
> <https://groups.google.com/d/msgid/ansible-project/A767305C-C137-4E0B-B1FD-DAAC2DDD32A6%40nist.gov?utm_medium=email&utm_source=footer>
> .
>

-- 
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/CAMc-rNNuhejhhNGzOfoQOq8MOLT6bBCjvgakLN6us8OSVVLDcA%40mail.gmail.com.

Reply via email to