Ansible 的 handler 是一种特殊的任务类型,它只在被其他任务通过 notify 关键字显式触发时才会执行。这种机制允许你将某些操作(如服务重启或配置文件重新加载)与配置更改解耦,确保这些操作仅在必要时执行。
Handler 的用途
Handlers 主要用于以下情况:
- 避免不必要的重启或重新加载。
- 执行配置更改后的清理操作。
- 执行一些只有在特定条件下才需要的操作。
如何定义 Handler
Handlers 通常定义在一个单独的 YAML 文件中,通常位于 Ansible 角色的 handlers/ 目录下,文件名为 main.yml。
示例
这里有一个简单的示例来说明如何定义和使用 handlers:
定义 Handler
在角色的 handlers/main.yml 文件中定义 handler 任务:
---
- name: Restart nginx
service:
name: nginx
state: restarted
触发 Handler
在角色的 tasks/main.yml 文件中定义任务,并使用 notify 关键字来标记 handler:
—
– name: Copy Nginx configuration
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: ‘0644’
notify: Restart nginx
在这个例子中,当配置文件 /etc/nginx/nginx.conf 被更新后,Ansible 会标记 Restart nginx handler 任务。在所有标记了 notify 的任务完成后,Ansible 将会执行 Restart nginx 任务。
更多示例
如果你想看到一个更完整的示例,我们可以创建一个包含 handler 的简单 Ansible 角色。这里是一个基于前面提到的 Nginx 角色的例子:
1、创建角色目录
ansible-galaxy role init nginx
2、编辑任务配置文件(tasks/main.yml):
---
- name: Install Nginx
package:
name: nginx
state: present
- name: Copy Nginx configuration
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: Restart nginx
3、定义 handler (handlers/main.yml):
---
- name: Restart nginx
service:
name: nginx
state: restarted
4、定义元数据 (meta/galaxy.yml):
---
galaxy_info:
author: Your Name
description: A role to install and configure Nginx
license: MIT
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- all
dependencies: []
5、在 Playbook 中使用角色
---
- name: Configure Nginx server
hosts: webservers
become: true
roles:
- nginx
这个示例展示了如何在角色中使用 handler 来重启 Nginx 服务,只有当配置文件发生变化时才会触发重启。