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_errorsfailed_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: yes và failed_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