Ansible Handlers – Hành động khi có thay đổi – Bài 8

Trong bài này, chúng ta sẽ tìm hiểu về một khái niệm rất đơn giản nhưng cực kỳ hữu ích đó là Ansible Handler.

Xem thêm:

Ansible Modules – Bài 7

Điều kiện và vòng lặp trong Ansible – Bài 6

1. Handler là gì?

Hiểu đơn giản, Handler là một loại task đặc biệt, chỉ được thực thi khi có một task khác “gọi” nó bằng notify.

Bạn có thể hiểu Handler như là “việc cần làm sau khi có thay đổi”.

Ví dụ:

  • Nếu bạn copy một file config mới, thì bạn cần restart lại dịch vụ để áp dụng.
  • Nhưng nếu file đó không thay đổi, thì không cần restart — tránh restart không cần thiết.

2. Cách hoạt động của Handler

Cơ chế hoạt động của Handler rất đơn giản:

  1. Một task có thể làm thay đổi hệ thống (ví dụ: copy file)
  2. Nếu có thay đổi, task đó sẽ gửi notify đến một Handler
  3. Handler sẽ được thực thi ở cuối play

Nếu không có thay đổi gì, Handler sẽ không chạy

Một điểm quan trọng:

Handler chỉ được thực thi sau khi toàn bộ các task còn lại chạy xong.

Tức là:

  • Ansible ghi nhớ rằng Handler cần chạy
  • Nhưng chờ đến cuối mới thực sự chạy

Điều này giúp đảm bảo handler không bị gọi nhiều lần nếu có nhiều task cùng notify nó.

3. Cách khai báo Handler

Bước 1: Gọi Handler trong task bằng notify

- name: Copy file cấu hình nginx
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
  notify: Restart Nginx

Bước 2: Khai báo Handler

handlers:
  - name: Restart Nginx
    service:
      name: nginx
      state: restarted

Lưu ý:

  • handlers: phải nằm cùng cấp độ thụt lề với tasks:
  • Tên handler trong notify phải khớp tuyệt đối với tên khai báo

Notify nhiều handler cùng lúc:

notify:
  - Reload Nginx
  - Restart PHP

Dùng when với Handler

Bạn có thể thêm điều kiện trong handler như bình thường:

handlers:
  - name: Restart Nginx
    service:
      name: nginx
      state: restarted
    when: ansible_facts['os_family'] == 'Debian'

4.Ví dụ tổng hợp

- name: Cấu hình nginx
  hosts: web
  become: yes

  tasks:
    - name: Copy file config
      copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: Restart Nginx

    - name: Tạo thư mục log
      file:
        path: /var/log/nginx
        state: directory

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted

Qua bài này, bạn đã hiểu Handler là gì và khi nào cần dùng nó. Đây là công cụ cực kỳ hữu ích giúp bạn đảm bảo dịch vụ được cập nhật đúng cách mà không gây restart không cần thiết.

Bài viết cùng chủ đề:

Ansible Variables – Biến trong Ansible là gì và cách sử dụng – Bài 5

Ansible Inventory – Bài 3

ansible playbook là gì? Cấu trúc và cách viết chuẩn – Bài 4

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em