Bài 10: Ansible Error Handling – Không Panic Khi Fail

Sau khi làm quen với Ansible Conditionals Loops DevOps ở bài trước, mình đã thấy playbook “thông minh” thế nào với whenloop – kiểu như nó có “bộ não” để tự quyết định. Nhưng mà hồi đó, mỗi lần playbook fail, mình hoảng loạn thật sự – màn hình đỏ lòm, không biết lỗi ở đâu, chỉ muốn tắt máy đi ngủ. Rồi mình mò ra Ansible Error Handling DevOps, và đúng là “cứu tinh” lúc khốn khó! Hôm nay, mình sẽ kể bạn nghe Ansible Error Handling DevOps là gì, cách xử lý lỗi trong playbook để không “panic” khi fail, và cùng thực hành một ví dụ để bạn tự tin hơn. Cùng bắt đầu nhé!

Ansible Error Handling DevOps Là Gì? – “Cứu Hỏa” Cho Playbook

Nói đơn giản, Ansible Error Handling DevOps là cách xử lý lỗi trong playbook để playbook không dừng đột ngột khi gặp vấn đề, hoặc để bạn kiểm soát lỗi một cách thông minh. Mặc định, nếu một task fail (VD: cài package không được), Ansible sẽ dừng ngay và báo lỗi đỏ lòm. Hồi mới làm DevOps, mình từng chạy playbook cài Nginx trên 5 server, đến server thứ 3 thì fail vì hết disk – thế là Ansible dừng, không chạy tiếp các server còn lại. Mình hoảng loạn, phải SSH tay để xử lý, mất cả buổi.

Rồi mình học Ansible Error Handling DevOps, và mọi thứ thay đổi. Ansible có nhiều cách xử lý lỗi:

  • ignore_errors: Bỏ qua lỗi, tiếp tục chạy task khác.
  • failed_when: Tự định nghĩa khi nào task được coi là fail.
  • registerwhen: Kiểm tra kết quả task, chạy task khác nếu cần. Mình từng nghĩ Bash script với if đã đủ để xử lý lỗi, nhưng Ansible làm việc này gọn hơn, đặc biệt khi quản lý nhiều server – không còn “panic” mỗi lần thấy lỗi nữa!

Cách Xử Lý Lỗi Cơ Bản – “Bình Tĩnh Đã”

Dưới đây là vài cách cơ bản để xử lý lỗi trong Ansible Error Handling DevOps. Mình sẽ dùng playbook cài Nginx từ bài trước để minh họa.

  1. Bỏ Qua Lỗi Với ignore_errors: Ví dụ, cài Nginx nhưng bỏ qua nếu fail. Sửa file roles/nginx/tasks/main.yml:

    - name: Install Nginx
     apt:
       name: nginx
       state: present
     become: yes
     ignore_errors: yes
    
    - name: Debug after ignoring error
     debug:
       msg: "We ignored the error and continued!"

    Chạy:

    ansible-playbook -i hosts playbook_with_role.yml

    Nếu task cài Nginx fail (VD: không có internet), Ansible sẽ bỏ qua và chạy tiếp task debug. Mình từng dùng ignore_errors khi kiểm tra disk – nếu server hết disk, mình vẫn muốn playbook chạy tiếp để báo cáo trạng thái.

  2. Tự Định Nghĩa Lỗi Với failed_when: Đôi khi bạn muốn task fail theo ý mình. Ví dụ, kiểm tra disk, nếu usage trên 90% thì coi là fail. Tạo file check_disk.yml:

    - name: Check disk usage
     hosts: webservers
     tasks:
       - name: Get disk usage
         shell: df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1
         register: disk_usage
       - name: Fail if disk usage is over 90%
         debug:
           msg: "Disk usage is {{ disk_usage.stdout }}% - too high!"
         failed_when: disk_usage.stdout | int > 90
    • register: Lưu kết quả lệnh vào biến disk_usage.
    • failed_when: Task fail nếu điều kiện đúng.

    Chạy:

    ansible-playbook -i hosts check_disk.yml

    Nếu disk usage trên 90%, task sẽ fail và báo lỗi. Mình từng quên chuyển disk_usage.stdout sang int, làm điều kiện sai – debug cả buổi mới ra.

Xử Lý Lỗi Thông Minh – “Đừng Chỉ Bỏ Qua”

Bỏ qua lỗi thì dễ, nhưng xử lý thông minh mới là pro. Dùng registerwhen để kiểm soát flow. Ví dụ, thử cài Nginx, nếu fail thì gửi thông báo. Sửa roles/nginx/tasks/main.yml:

- name: Try to install Nginx
  apt:
    name: nginx
    state: present
  become: yes
  register: nginx_install
  ignore_errors: yes

- name: Notify if Nginx install failed
  debug:
    msg: "Failed to install Nginx on {{ ansible_hostname }}. Check the server!"
  when: nginx_install.failed

- name: Create Nginx config if install succeeded
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/sites-available/default
    mode: '0644'
  notify: Restart Nginx
  become: yes
  when: not nginx_install.failed

Chạy playbook:

ansible-playbook -i hosts playbook_with_role.yml
  • Nếu cài Nginx fail, task debug sẽ chạy, in thông báo.
  • Nếu thành công, task template sẽ tiếp tục.

Mình từng quên ignore_errors, làm playbook dừng ngay khi cài fail – không gửi được thông báo. Nên nhớ: Kết hợp ignore_errorswhen để xử lý lỗi “mượt” hơn.

Thực Hành Nhẹ: Kiểm Tra Disk Và Xử Lý Lỗi

Giờ bạn thử kết hợp: kiểm tra disk, nếu usage trên 80%, tạo file cảnh báo. Tạo file disk_alert.yml:

- name: Check disk and alert
  hosts: webservers
  tasks:
    - name: Get disk usage
      shell: df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1
      register: disk_usage
      ignore_errors: yes
    - name: Create alert file if disk usage over 80%
      copy:
        content: "Warning: Disk usage is {{ disk_usage.stdout }}% on {{ ansible_hostname }}!"
        dest: /tmp/disk_alert.txt
        mode: '0644'
      when: disk_usage.stdout | int > 80
      become: yes
    - name: Debug disk usage
      debug:
        msg: "Disk usage is {{ disk_usage.stdout }}% - under control!"
      when: disk_usage.stdout | int <= 80

Chạy:

ansible-playbook -i hosts disk_alert.yml

Kết quả: Nếu disk usage trên 80%, file /tmp/disk_alert.txt sẽ được tạo; nếu không, in thông báo “under control”. Kiểm tra:

ssh ubuntu@192.168.1.10 "cat /tmp/disk_alert.txt"

Mình từng quên | int, làm điều kiện sai – file cảnh báo không tạo. Nên nhớ: Chuyển biến kiểu string sang int khi so sánh số!

Mẹo Nhỏ Từ Kinh Nghiệm Thật

  • Dùng --check để thử: Mô phỏng trước khi chạy thật:
    ansible-playbook -i hosts disk_alert.yml --check

    Mình hay làm thế để tránh lỗi bất ngờ.

  • Debug với debug: Dùng debug để kiểm tra giá trị biến trước khi dùng when.
  • Kết hợp changed_when: Nếu task không nên báo “changed”, dùng changed_when: false.

Có lần mình chạy playbook kiểm tra disk, quên ignore_errors, server hết disk làm task fail, playbook dừng – không gửi được cảnh báo.. Từ đó, mình luôn thêm ignore_errors cho task “nguy hiểm”.

Cảm Nhận Sau Khi Dùng Error Handling

Lần đầu dùng Ansible Error Handling DevOps, mình thấy nó như “người cứu hỏa” – không còn panic khi playbook fail nữa. So với Bash script, error handling trong Ansible dễ viết và mạnh mẽ hơn, đặc biệt khi quản lý nhiều server. Cảm giác như vừa “bình tĩnh hóa” công việc – xử lý lỗi mà không lo “toang”!

Tiếp Theo Là Gì?

Bài này tụi mình đã làm quen với Ansible Error Handling DevOps, từ bỏ qua lỗi đến xử lý thông minh. Lần sau, mình sẽ kể bạn nghe về Ansible với cloud – cách quản lý AWS hay GCP, kiểu như “chơi lớn” với DevOps. Chịu không?

Thử Nghiệm Nhẹ: Thử thêm task gửi email giả lập (dùng debug) nếu disk usage trên 90%. Có gì thắc mắc cứ nhắn mình nhé – error handling là “lá chắn”, làm quen tốt là bạn đã sẵn sàng cho mọi tình huống!

Điều hướng chuỗi bài viết<< Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển
>> Bài 11: Ansible Quản Lý Cloud – Chơi Lớn Với AWS
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận