What's correct Jinja2 operator to do "less than" on a string?

2,018 views
Skip to first unread message

Robert F

unread,
May 24, 2016, 1:29:13 PM5/24/16
to Ansible Project
I'm setting an Ansible fact like this:

    set_fact: server_num={{ ansible_hostname[-2:] }}

server_num can take these values:

    '00'
    '01'
    '02'
    '03'
    '04'
    ad infinitum

If I want a conditional that will evaluate to True for all server numbers less than a particular server number 'n' I'd like to be able to do this:

    when: server_num < 'n'

However, this throws the error "error while evaluating conditional: server_num < 'n'

I could do this but clearly it doesn't scale:

   when: server_num == '00' or server_num == '01' or ... or server_num == 'n-1'

Is there a more succinct way to do this?  I can't seem to find a Jinja2 "less than" operator.

Thanks.

Josh Smift

unread,
May 24, 2016, 1:39:46 PM5/24/16
to ansible...@googlegroups.com
Hmm, this trivial playbook works for me:

- hosts: localhost
tasks:
- debug: msg="Yep!"
when: server_num < '03'

With '--extra-vars server_num=02', I get

TASK: [debug msg="Yep!"]
******************************************************
ok: [localhost] => {
"msg": "Yep!"
}


and with '--extra-vars server_num=17' I get

TASK: [debug msg="Yep!"]
******************************************************
skipping: [localhost]

Maybe you've got the 'when' in the wrong place or something? Or server_num
isn't getting set like you think it is?

-Josh (j...@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.

Robert F

unread,
May 24, 2016, 1:56:41 PM5/24/16
to Ansible Project
Yea, it's weird.  Sometimes "<" works for me and sometimes it doesn't.  I couldn't find this operator documented in the Jinja2 or Ansible docs and I don't recall where I first learned it so I figured maybe it's an invalid operator.  I put a debug statement right before the line where I'm referencing server_num and it said it was set as I expected it to be but the statement still failed.

Matt Martz

unread,
May 24, 2016, 2:02:15 PM5/24/16
to ansible...@googlegroups.com
The less than operator is documented at http://jinja.pocoo.org/docs/dev/templates/#comparisons

Although, trying to use mathematical operations on string values isn't exactly always straight forward.

You might get better results from the `version_compare` filter such as:

when: server_num|version_compare('100', 'lt')


--
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-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/a41571c0-9e9c-42c3-a6ed-b5abebc02732%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--
Matt Martz
@sivel
sivel.net

Robert F

unread,
May 24, 2016, 2:07:10 PM5/24/16
to Ansible Project
I see.  I agree that doing math on strings is somewhat questionable.  I'll check out version_compare.  Thanks Matt.

Josh Smift

unread,
May 24, 2016, 2:13:58 PM5/24/16
to ansible...@googlegroups.com
RF> I see. I agree that doing math on strings is somewhat questionable.

Well, strings can be sorted, and compared in that way. I wouldn't bet on
what adding 1 to a string would do, but comparisons seem legit.

http://jinja.pocoo.org/docs/dev/templates/#comparisons is where I found
the comparisons too, FWIW.

-Josh (j...@care.com)
Reply all
Reply to author
Forward
0 new messages