Hi,
I am getting the following error one the second run of my play book but i am not sure why or what I should be doing to correct it.
fatal: [idb-13] => error while evaluating conditional: {u’changed’: False, u’group’: u’root’, u’uid’: 0, ‘dest’: u’/usr/local/bin/im_supervisor’, ‘md5sum’: ‘a5d74c539224f1c7a3dfdf091af13c64’, u’owner’: u’root’, u’state’: u’file’, u’gid’: 0, u’mode’: u’0700’, ‘invocation’: {‘module_name’: u’copy’, ‘module_args’: u’src=im_supervisor dest=/usr/local/bin/im_supervisor mode=0700’}, u’path’: u’/usr/local/bin/im_supervisor’, u’size’: 239}
Here is the relevant part of the common/tasks/main.yml
-
name: configure supervisor
copy: src=supervisord.conf dest=/etc/supervisor/supervisord.conf
register: restart_supervisor
-
name: configure supervisor default
copy: src=supervisor.default dest=/etc/default/supervisor
register: restart_supervisor
-
copy: src=im_supervisor dest=/usr/local/bin/im_supervisor mode=0700
register: restart_supervisor
-
shell: /usr/local/bin/im_supervisor restart;
when: restart_supervisor
Thanks
Mark
You want “when: restart_supervisor|changed”. See: http://docs.ansible.com/playbooks_variables.html#filters-often-used-with-conditionals
However, by registering the variable each time, you’re not going to get the behavior you’re after. If the first task changes, but the second two do not, I don’t believe that you’ll restart supervisor. Instead, look into handlers: http://docs.ansible.com/playbooks_intro.html#handlers-running-operations-on-change
Hi Mark,
It looks like you’re not quite up to speed on how conditionals work yet, and that’s ok.
What you have registered in the first call is the result of the operation, which is a hash (or a dictionary, as Python calls it).
Each time you are then storing a different result in it, as you have it written, each time a different hash.
At no point is this hash table actually a boolean, which is why you can’t just use it there in the conditional.
It sounds like you are trying to restart supervisor only if any of the above 3 things changed, which CAN be done the way you have it, but you would need to set three different vars and then do:
when: foo.changed or bar.changed and baz.changed
But that’s a hack.
A much better thing to do would be to use handlers:
http://docs.ansible.com/playbooks_intro.html
Signalled here by “notify”.
If you need handlers to run at a certain point, rather than the end of the play, you can use the task:
For completeness:
-
name: configure supervisor
copy: src=supervisord.conf dest=/etc/supervisor/supervisord.conf
notify: restart supervisor
-
name: configure supervisor defaults
copy: src=supervisor.default dest=/etc/default/supervisor
notify: restart supervisor
-
name: copy over file
copy: src=im_supervisor dest=/usr/local/bin/im_supervisor mode=0700
notify: restart supervisor
-
meta: flush_handlers # only if you want to do this now and not at the end of the play
In your handlers file:
- name: restart supervisor
shell: …
There are also supervisor modules in ansible that you can use, or the service module.
Hi
Thanks yep I think I got notify and register a bit mixed up
Thanks
Mark
Mark Olliver
Head of IT Operations
InfectiousMedia