在本章中,我将为您介绍 Ansible 中的 Handler 语句是什么,以及如何在您的 Ansible Playbook 中日常使用它。

Handler 的作用

  1. 仅在必要时运行操作 Handler 对于实现幂等性非常重要。它们允许您仅在必要时执行某些步骤,从而在不需要执行时节省计算资源。
  2. 与任务的解耦执行 Handler 是一种特殊的任务,通常用于在某些条件满足时执行操作,例如重启服务。它们不会在每个任务执行时立即运行,而是等到所有任务完成后,根据通知(notify)触发。

示例:滚动更新

文件名:rollingupdate.yml

---
- name: Rolling update
  hosts: all
  become: true
  tasks:
    - name: latest apache httpd package is installed
      ansible.builtin.yum:
        name: httpd
        state: latest
      notify: restart apache  # 通知 Handler

  handlers:
    - name: restart apache  # Handler 名称
      ansible.builtin.service:
        name: httpd
        state: restarted

解释

  • 任务部分: 在任务中,ansible.builtin.yum 模块用于确保 httpd 包是最新版本。如果检测到更新,则会安装新版本。
  • notify 语句: 在任务中,notify 用于指定需要触发的 Handler 名称。如果任务导致了变更(例如安装了新版本的 httpd 包),则会通知对应的 Handler。
  • Handler 部分: Handler 的名称为 restart apache,它使用 ansible.builtin.service 模块重启 httpd 服务。重要的是,Handler 只有在被通知时才会运行。如果没有触发通知(例如没有更新 httpd 包),Handler 将不会执行。

Handler 的优势

  • 幂等性: Handler 确保某些操作(如重启服务)仅在必要时执行。如果软件包没有更新,则不会重启服务,从而避免不必要的中断。
  • 节省资源: Handler 的执行是延迟的,只有在所有任务完成后才会运行。这减少了不必要的操作,节省了计算资源。
  • 灵活性: Handler 可以被多个任务引用,且每个 Handler 的执行是独立的。一个复杂的 Playbook 可以包含多个 Handler,通过名称引用它们。

复杂 Playbook 中的多个 Handler

在一个更复杂的 Playbook 中,您可以定义多个 Handler,并根据需要通过任务中的 notify 语句触发它们。例如:

---
- name: Complex playbook with multiple handlers
  hosts: all
  become: true
  tasks:
    - name: Ensure nginx is installed
      ansible.builtin.yum:
        name: nginx
        state: latest
      notify: restart nginx

    - name: Configure nginx
      ansible.builtin.copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: restart nginx

    - name: Ensure mariadb is installed
      ansible.builtin.yum:
        name: mariadb
        state: latest
      notify: restart mariadb

  handlers:
    - name: restart nginx
      ansible.builtin.service:
        name: nginx
        state: restarted

    - name: restart mariadb
      ansible.builtin.service:
        name: mariadb
        state: restarted

总结

Handler 是 Ansible Playbook 中非常重要的组件,用于实现幂等性和节省资源。它们允许您仅在必要时执行某些操作,例如重启服务。通过合理使用 Handler,您可以编写更加高效和可靠的自动化脚本。