when statements should not include jinja2 templating delimiters

I'm getting a benign warning below:

 [WARNING]: when statements should not include jinja2 templating
 delimiters such as {{ }} or {% %}.
 Found: not ansible_check_mode and (zerotier_status != "OK" or
 zerotier_name != "{{ inventory_hostname }}")

In this specific case I could get away with dropping the final clause of
the `when` check, but does anybody have an idea how to refactor this to
avoid the warnings in future? I get the feeling I'm missing some very
obvious pattern here.

- name: zerotier | authorise this connection
  uri:
    url: https://my.zerotier.com/api/network/{{ net.zerotier.network
    }}/member/{{ zerotier_address }}
    method: POST
    HEADER_Authorization: "Bearer {{ net.zerotier.token }}"
    body_format: json
    body:
      name: "{{ inventory_hostname }}"
      config:
        authorized: true
    return_content: yes
  register: zerotier_authorisation
  when: not ansible_check_mode and (zerotier_status != "OK" or
  zerotier_name != "{{ inventory_hostname }}")
  tags:
    - zerotier

Dave,
You could easily just rewrite as below and it should solve your issue.

when: >
not ansible_check_mode and (zerotier_status != “OK” or
zerotier_name != inventory_hostname)

In this specific case I could get away with dropping the final clause
of the `when` check, but does anybody have an idea how to refactor
this to avoid the warnings in future? I get the feeling I'm missing
some very obvious pattern here.

Just drop the Jinja delimiters: Since 'when' is already expecting Jinja,
you don't need to mark variables, instead you need to mark literal strings
(like how you quoted "OK").

  when: not ansible_check_mode and (zerotier_status != "OK" or zerotier_name != inventory_hostname)

Should do the trick -- all those unquoted strings are variable names. (Or
keywords, like "not" and "and". :^)

                                      -Josh (jbs@care.com)

(apologies for the automatic corporate disclaimer that follows)

This email is intended for the person(s) to whom it is addressed and may contain information that is PRIVILEGED or CONFIDENTIAL. Any unauthorized use, distribution, copying, or disclosure by any person other than the addressee(s) is strictly prohibited. If you have received this email in error, please notify the sender immediately by return email and delete the message and any attachments from your system.

when statements are already executed in the context of jinja, and shouldn’t also include jinja2 delimiters.

To fix your when statement is pretty simple:

when: not ansible_check_mode and (zerotier_status != “OK” or
zerotier_name != inventory_hostname)

Effectively all you generally need is to remove the {{ }}, and since you wrapped the delimiters in quotes, remove them too.

You were already using other vars without {{ }}.

#facepalm moment - thanks everybody!

A+
Dave