Ansible handler

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 服务,只有当配置文件发生变化时才会触发重启。

Index