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.
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.
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.