Danh sách bài viết trong series Sử dụng Ansible tự động hệ thống
- Bài 1: Ansible Là Gì Mà Dân DevOps Mê Thế?
- Bài 2: Ansible Inventory – Danh Bạ Server Của Bạn
- Bài 3: Ansbile Ad-Hoc – Lệnh Nhanh Như Chớp
- Bài 4: Ansbile Playbook Đầu Tiên – Đừng Sợ YAML
- Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ
- Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng
- Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn
- Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel
- Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển
- Bài 10: Ansible Error Handling – Không Panic Khi Fail
- Bài 11: Ansible Quản Lý Cloud – Chơi Lớn Với AWS
- Bài 12: Ansible Dynamic Inventory – Danh Sách Server Tự Động
- Bài 13: Ansible Vault – Khóa Két Sắt Cho Bí Mật
- Bài 14: Ansible Tower/AWX – Trung Tâm Điều Khiển DevOps
- Bài 15: Ansible Best Practices – Viết Ansible Sạch, Chạy Đỉnh Cao
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 when
và loop
– 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.register
vàwhen
: Kiểm tra kết quả task, chạy task khác nếu cần. Mình từng nghĩ Bash script vớiif
đã đủ để 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.
-
Bỏ Qua Lỗi Với
ignore_errors
: Ví dụ, cài Nginx nhưng bỏ qua nếu fail. Sửa fileroles/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ùngignore_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. -
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 filecheck_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ếndisk_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
sangint
, 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 register
và when
để 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_errors
và when
để 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ùngdebug
để kiểm tra giá trị biến trước khi dùngwhen
. - Kết hợp
changed_when
: Nếu task không nên báo “changed”, dùngchanged_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!