One of the things that I miss in Ansible is an equivalent of Chefʼs
notifies :immediately. The problem that I was trying to solve is resizing the MySQLʼs binary logs (which turns out to be a bit more complicated). Basically, you install MySQL, then change the configuration file and finally restart MySQL which, causes MySQL to barf because the binary logs arenʼt the correct size.
The solution that sprang to mind for this was to delete the binary logs immediately after installation and changing the configuration file. Handlers canʼt quite do this. They only run at the end of the current playbook block. There also isnʼt a way to only run the handler if both things have changed. Ansibleʼs documentation isnʼt much help in this regard. The When statement documentation gets you fairly close but, not quite there.
Here is how you can do it. In my case, I
register: mysql_installation in the MySQL installation and
register: config_status in the template block for changing the configuration. Then on our “handler” task we add
when: mysql_installation|changed and config_status|changed. Here is what it looks like all together:
--- - name: Install mysql apt: name=mysql state=present register: mysql_installation - name: Configure mysql template: src=my.cnf.j2 dest=/etc/mysql/my.cnf owner=root group=root notify: Restart mysql register: config_status - name: Delete binary logs shell: service mysql stop && rm -rf /var/lib/mysql/ib_logfile* && service mysql start when: mysql_installation|changed and config_status|changed
There are better solutions to my original problem but, I think this technique could be useful for other things.