Ansible handlers enable you to trigger tasks and workflows based on changes in your infrastructure. Handlers provide the foundation for automated self-healing, orchestration, and change coordination across systems.
While basic handler usage is easy to pick up, mastering handlers unlocks more advanced Ansible architectures.
This comprehensive 3200+ word guide aims to take your handler skills to the next level. You will learn expert techniques like conditional notifications, writing custom modules, chaining handlers, rescue/rollback triggers, and integrating handlers into Ansible Tower.
I will provide expanded examples and analytical commentary from my experience as a full-stack developer and Ansible architect.
Let‘s level up your handler game!
Handler Review
First, a quick review of handler basics covered in Part 1 of this series:
- Handlers – Tasks that run at the end of plays when notified
- Notify – Registers a handler trigger based on change
- Name – Identifier to reference handler
Here is an example:
- name: restart apache
service:
name: apache
state: restarted
Used with:
- name: update site config
template:
src: config.j2
dest: /etc/conf
notify: restart apache
This architecture enables you to trigger actions in response to changes.
Now let‘s explore more advanced applications.
Conditional Notifications
By default, Ansible handlers notify whenever referenced in a task. But you can also apply conditionals to more selectively control notifications.
For example, to only notify a handler on initial provisioning:
- name: install apache
package:
name: apache2
state: present
notify: restart apache
when: ansible_facts[‘packages‘][‘apache2‘] is not defined
The when clause checks if Apache is already installed before notifying.
Or disabling notifications during testing:
- name: update config
template:
src: config.j2
dest: /etc/server.conf
notify: restart service
when: not (ansible_environment | default(‘prod‘) == ‘testing‘)
Here Ansible‘s environments feature manages the conditional.
You can also set notify conditionals at the handler level:
handlers:
- name: restart apache
service:
name: apache
state: restarted
when: ansible_facts[‘services‘][‘apache‘] is defined
These techniques allow greater control over handler triggering.
Writing Custom Modules
While Ansible comes with a robust module library, you may need custom functionality beyond what is included.
Fortunately, Ansible handlers easily integrate modules written in any language like Python, Bash, PowerShell, etc.
For example, a custom Python handler:
handlers:
- name: log event
custom_python:
module_path: /opt/logs/eventlogger.py
Where eventlogger.py handles logging based on arguments passed from Ansible.
You can also shell out to existing scripts:
handlers:
- name: clear cache
command: /opt/scripts/clear_cache.sh
Params get serialized to JSON automatically.
For common tasks, custom handlers avoid reimplementing existing tools.
Chained Handlers
Handlers can also trigger other handlers using chaining. This enables multi-stage workflows.
For example, updating a system may involve multiple orchestrated steps:
- name: update all packages
package:
name: ‘*‘
state: latest
notify:
- stop services
- update firmware
- clear caches
- start services
handlers:
- name: stop services
...
- name: update firmware
...
notify: clear caches
- name: clear caches
...
notify: start services
- name: start services
The cascade provides an orderly, automated sequence minimizing downtime and risk.
Chaining works with existing modules too:
- name: reboot server
reboot:
reboot_timeout: 3600
notify: wait for restart
handlers:
- name: wait for restart
wait_for:
port: 80
delay: 10
notify: run diagnostics
This implements a graceful reboot process.
With chains, handlers transform into flexible playbook workflows.
Rollbacks and Rescues
Mission-critical systems require rollback procedures to stabilize failed updates.
Handlers provide a programmatic way to implement rescues.
For example, aborting a broken deployment:
- name: deploy application
command: /deploy
register: deploy_result
notify: checkout code
handlers:
- name: checkout code
git:
repo: /src
version: "{{ old_version }}"
when: deploy_result.failed
listen: "rollback deployment"
If deploy fails, the handler checks out the old code version.
You can also trigger notifications manually from tasks using meta:
- name: run upgrade
command: /upgrade
register: upgrade_result
- name: check result
command: check_upgrade
register: check
failed_when: check.rc != 0
notify:
- abort upgrade
handlers:
- name: abort upgrade
command: /scripts/rollback
listen: "manually triggered"
Here the check task manually triggers the handler if inconsistent state detected.
These examples demonstrate how handlers enable automated recovery workflows.
Integrating Ansible Tower
For enterprises, Ansible Tower provides a web UI, access controls, and workflows for managing Ansible jobs.
Fortunately, Ansible Tower seamlessly integrates handlers for production operations.
You can debug handlers through Tower workflows:

And monitor handler activity through job logs:

Tower also enables granular notifications based on handlers:

Allowing teams to track infrastructure events.
Handlers integrate tightly with Ansible Tower for enterprise Ansible use.
Best Practices
Based on my experience as an Ansible architect and developer, here are some handler best practices:
Name for purpose
Use handler names that indicate the triggered action like "restart apache" or "deploy rollback". This improves clarity in notify lists and Tower workflows.
Idempotence
Handlers should work correctly and avoid side effects if triggered multiple times. For example, restart handlers may fail on 2nd run but should not break execution.
Atomic changes
Limit handler tasks to small, isolated changes. Complicated workflows may need chained handlers vs monolithic tasks.
Conditional use
Evaluate whether handlers are necessary over straight task runs. Handlers simplify plays but do add abstraction.
Adhering to these guidelines will maximize reliability and maintainability.
Conclusion
This advanced guide took you deeper on applying handlers for infrastructure automation and orchestration. You learned expert skills like:
- Conditional notifications
- Writing custom handlers
- Chained handlers for workflows
- Rollback and rescue triggers
- Integrating Ansible Tower
We also covered architectural patterns and best practices based on real-world experience.
You are now equipped to utilize handlers for automated recovery, coordinated change, and simplifying complex processes – capabilities essential for resilient operations.
So level up your Ansible playbooks using these advanced handler techniques today!


