Help me understand 'when:' conditionals. Cause I seem to fumble with them quite frequently.

85 views
Skip to first unread message

ji...@pristine.io

unread,
Dec 30, 2014, 3:22:49 PM12/30/14
to ansible...@googlegroups.com
Hello everyone!

Conditionals seem to be very difficult to get right for some reason so I am hoping someone can explain why the following doesn't seem to work. Or show me the way. :)

I am simply trying to check the current timezone of the server and if it doesn't match CST then run a handler to update it. Here's the code:
- name: Get timezone info
  shell
: date
 
register: zoneinfo

Then just to make sure I have the right data I use debug to print the zoneinfo var I just registered:
- name: Print zoneinfo for debug
  debug
: var="zoneinfo.stdout"

This outputs:
TASK: [common | Print zoneinfo for debug] *************************************
ok
: [10.10.10.10] => {
   
"zoneinfo.stdout": "Tue Dec 30 14:11:03 CST 2014"
}

Referring to the Ansible docs I can use something like when: zoneinfo.stdout.find('CST') != 1 but no matter what I try I can't get it to work.

I have tried the following:

- name: If timezone is not CST then remove /etc/localtime and call set timezone handler
  file
: path=/etc/localtime state=absent
 
when: zoneinfo.stdout.find('CST') != 1
  notify
:
 
- set timezone

I have tried not true. Is not. == 1 == 0 and several other options but its not working.

Any suggestions?

Thanks!

Tom Bamford

unread,
Dec 30, 2014, 3:45:45 PM12/30/14
to ansible...@googlegroups.com

Hi

For substring comparisons, I use the ‘in’ keyword like this:

- name: Get timezone info
  shell: date
  register: zoneinfo
  changed_when: no
- name: If timezone is not CST then remove /etc/localtime and call set timezone handler
  file: path=/etc/localtime state=absent
  when: '"CST" in zoneinfo.stdout'
  notify: set timezone

The entire conditional is quoted in order to conform to yaml syntax. You could also add changed_when: no to the first task that runs date, so that Ansible doesn’t report it as a changed task.

In this case, I would probably use a task rather than a handler for ‘set timezone’ - should your playbook run fail, the handler will not be invoked and the timezone will not get configured.

Regards

Tom


--
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/1c7a5e23-6375-4136-9b75-38777dbf1e41%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Scott Sturdivant

unread,
Dec 30, 2014, 3:51:09 PM12/30/14
to ansible...@googlegroups.com
As with Tom, I too use the 'in' keyword for substring compares.  That said, the reason why your 'when' is failing is because .find(str) is returning the index into the string where the match (if found) begins.  In your case, it should be returning 20 for a successful match.  For no match, it will return -1.  It seems like you've just omitted the negative sign in your comparison.

ji...@pristine.io

unread,
Dec 30, 2014, 4:04:51 PM12/30/14
to ansible...@googlegroups.com
Thanks Tom and Scott,

Both replies very helpful! Thanks!
Reply all
Reply to author
Forward
0 new messages