Hướng dẫn sử dụng Error Handling trong Ansible Playbook

Trong quá trình chạy Ansible Playbook, đôi khi bạn sẽ gặp lỗi trong một số task. Theo mặc định, nếu một task bị lỗi, playbook sẽ dừng lại và các task phía sau sẽ không được thực thi.
Điều này có thể gây bất tiện trong những tình huống bạn muốn bỏ qua một lỗi nhỏ để tiếp tục chạy các task khác.

Để xử lý tình huống này, Ansible cung cấp cơ chế Error Handling thông qua các tùy chọn như:

  • ignore_errors
  • failed_when

Trong bài này, chúng ta sẽ tìm hiểu chi tiết cách sử dụng hai tùy chọn này.

Xem thêm:

Ansible là gì? Vì sao chúng ta lại cần nó – Bài 1

Ansible Inventory – Bài 3

1. Chuẩn bị môi trường

  • Máy chủ cài Ansible (VD: Ansible Engine trên Ubuntu/WSL).
  • Một Ansible client (VD: EC2 instance trên AWS hoặc máy ảo Ubuntu).
  • File inventory chứa thông tin host.

Ví dụ inventory.ini:

[web]
192.168.1.10 ansible_user=ec2-user

2. Viết playbook cơ bản (chưa có error handling)

Tạo file error_handling_1.yml:

---
- name: Error Handling in Ansible Playbook
  hosts: app
  become: yes
  become_user: root

  tasks:
    - name: List file in /etc directory
      command: ls -l /etc
      register: etc_out

    - name: Show /etc directory listing
      debug:
        var: etc_out.stdout_lines

    - name: List file in /tmp directory
      command: ls -l /tmp
      register: tmp_out

    - name: Show /tmp directory listing
      debug:
        var: tmp_out.stdout_lines

Khi chạy playbook này, nếu một trong các task shell bị lỗi (ví dụ sai đường dẫn), toàn bộ playbook sẽ dừng lại.

3. Sử dụng ignore_errors để bỏ qua lỗi

Trong trường hợp bạn muốn bỏ qua lỗi ở một task, chỉ cần thêm ignore_errors: yes.

Ví dụ sửa lại task đầu tiên:

- name: List files in /etcc directory (cố tình viết sai)
  command: ls -l /etcc
  register: wrong_out
  ignore_errors: yes

- name: Show wrong_out result
  debug:
    var: wrong_out

Lúc này, dù task đầu tiên bị lỗi (/etcc không tồn tại), playbook vẫn chạy tiếp các task sau.

Output sẽ hiển thị:

  • Một thông báo lỗi được bỏ qua.
  • Các task tiếp theo vẫn được thực hiện.

4. Sử dụng failed_when để điều kiện hóa lỗi

Mặc định, Ansible coi exit code khác 0 là lỗi. Tuy nhiên, đôi khi bạn muốn tự định nghĩa điều kiện fail.

Ví dụ: Nếu lệnh trả về rc=2 thì coi như fail, còn các giá trị khác thì bỏ qua.

- name: List files in /etcc directory
  shell: ls -l /etcc
  register: wrong_out
  ignore_errors: yes

- name: Fail when return code = 2
  debug:
    msg: "Custom check: The command failed with rc=2"
  failed_when: wrong_out.rc == 2

Trong trường hợp này:

  • Task đầu tiên bị lỗi nhưng không dừng playbook.
  • Task debug sẽ được kiểm tra. Nếu wrong_out.rc == 2, task này sẽ bị coi là fail có chủ đích.

5. Khi nào nên dùng error handling?

  • ignore_errors: khi bạn muốn tiếp tục chạy các task khác dù một task nào đó thất bại.
    • Ví dụ: kiểm tra thư mục, stop service trước khi uninstall (nếu không tồn tại thì bỏ qua).
  • failed_when: khi bạn muốn kiểm soát logic thất bại theo điều kiện riêng.
    • Ví dụ: chỉ fail khi return code cụ thể, hoặc khi output chứa chuỗi đặc biệt.

Tóm lại, bạn có thể kết hợp ignore_errors: yesfailed_when để viết playbook linh hoạt, an toàn và phù hợp với thực tế hơn.

Cảm ơn bạn đã tham khảo ansible tutorial trên ttnguyen.net

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

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

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

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