Introduction to Handlers
Handlers in Ansible are special tasks that are triggered by other tasks. They are typically used to perform actions that need to happen only once after a series of tasks have been executed, such as restarting a service after a configuration file has been changed.
Key Concepts
- Handlers: Special tasks that are triggered by the
notifydirective. - Notify: A directive used in a task to trigger a handler.
- Listen: A directive used in a handler to allow multiple tasks to notify the same handler.
Creating Handlers
Handlers are defined similarly to regular tasks but are placed under a handlers section in a playbook or role. Here is a basic example:
---
- name: Example playbook with handlers
hosts: webservers
tasks:
- name: Install Apache
apt:
name: apache2
state: present
notify: Restart Apache
handlers:
- name: Restart Apache
service:
name: apache2
state: restartedExplanation
- Tasks Section: Contains the tasks to be executed. In this example, it installs the Apache web server.
- Notify Directive: The
notifydirective in the task triggers theRestart Apachehandler. - Handlers Section: Contains the handler definition. The handler will restart the Apache service when notified.
Practical Example
Let's create a more detailed example where we update a configuration file and then restart the service.
Playbook Example
---
- name: Update Nginx configuration and restart service
hosts: webservers
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
notify: Restart Nginx
- name: Update Nginx configuration
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restartedExplanation
- Install Nginx Task: Installs the Nginx web server and notifies the
Restart Nginxhandler. - Update Nginx Configuration Task: Updates the Nginx configuration file using a template and notifies the
Restart Nginxhandler. - Restart Nginx Handler: Restarts the Nginx service when notified.
Practical Exercise
Exercise
- Create a playbook that installs MySQL, updates its configuration file, and restarts the MySQL service.
- Use handlers to ensure the MySQL service is restarted only if the configuration file is changed.
Solution
---
- name: Install and configure MySQL
hosts: databases
tasks:
- name: Install MySQL
apt:
name: mysql-server
state: present
notify: Restart MySQL
- name: Update MySQL configuration
template:
src: my.cnf.j2
dest: /etc/mysql/my.cnf
notify: Restart MySQL
handlers:
- name: Restart MySQL
service:
name: mysql
state: restartedExplanation
- Install MySQL Task: Installs the MySQL server and notifies the
Restart MySQLhandler. - Update MySQL Configuration Task: Updates the MySQL configuration file using a template and notifies the
Restart MySQLhandler. - Restart MySQL Handler: Restarts the MySQL service when notified.
Common Mistakes and Tips
- Multiple Notifications: If multiple tasks notify the same handler, the handler will only run once at the end of the playbook execution.
- Handler Names: Ensure handler names are unique within the playbook to avoid conflicts.
- Idempotency: Handlers should be idempotent, meaning running them multiple times should not change the system state after the first run.
Conclusion
Handlers are a powerful feature in Ansible that allow you to perform actions conditionally based on the state of other tasks. By using handlers, you can ensure that services are restarted or other actions are taken only when necessary, making your playbooks more efficient and reliable.
In the next section, we will explore how to use templates in Ansible to manage configuration files dynamically.
Ansible: From Beginner to Advanced
Module 1: Introduction to Ansible
Module 2: Ansible Basics
Module 3: Playbooks
- Introduction to Playbooks
- Writing Your First Playbook
- Playbook Structure
- Variables and Facts
- Conditionals and Loops
Module 4: Roles
Module 5: Advanced Playbook Techniques
Module 6: Ansible Galaxy
Module 7: Ansible Tower
- Introduction to Ansible Tower
- Installing Ansible Tower
- Using Ansible Tower
- Managing Projects and Inventories
