Đôi khi Bash script tốt hơn Ansible
So sánh Bash và Ansible trong DevOps: khi nào nên dùng Bash script, khi nào nên dùng Ansible? Code mẫu deploy + restart service trên cả hai.
Bash vs Ansible — Khi nào nên chọn cái nào?
Trong series Bash, chúng ta đã thấy Bash cực kỳ mạnh mẽ cho automation. Nhưng trong DevOps, Ansible cũng là một lựa chọn phổ biến cho infrastructure automation. Vậy khi nào nên dùng Bash, khi nào nên dùng Ansible?
Đây không phải là câu hỏi “cái nào tốt hơn” mà là “cái nào phù hợp hơn” cho tình huống cụ thể. Bài viết này sẽ so sánh khách quan, kèm code mẫu thực tế, để bạn đưa ra lựa chọn đúng đắn.
So sánh tổng quan
| Tiêu chí | Bash | Ansible |
|---|---|---|
| Learning curve | Thấp — ai cũng biết | Trung bình — cần học YAML, modules |
| Đọc hiểu | Rất dễ — plain text | Dễ — YAML rõ ràng |
| Idempotent | Không — cần viết thủ công | Có — built-in |
| Tái sử dụng | Trung bình — source/function | Cao — roles, modules |
| Inventory | Manual — file hoặc array | Built-in — dynamic inventory |
| Testing | Khó — cần mock | Dễ — molecule |
| Debug | Dễ — bash -x | Trung bình — verbose mode |
| Dependency | Không có | Cần Python, SSH |
| Remote execution | SSH thủ công | Built-in |
| Khi nào phù hợp | Quick scripts, small tasks | Complex infrastructure, multi-server |
Khi nào nên dùng Bash?
Bash phù hợp khi:
- Script đơn giản, chạy locally — backup, cleanup, health check
- Debug nhanh —
bash -xgiúp see từng dòng thực thi - Không cần dependency — Bash có sẵn trên mọi Linux server
- Team nhỏ, cần sự linh hoạt — không muốn setup Ansible infrastructure
- On-call situation — cần fix nhanh, không có thời gian học playbook
Code mẫu: Deploy với Bash
| |
Khi nào nên dùng Ansible?
Ansible phù hợp khi:
- Infrastructure phức tạp — nhiều servers, nhiều roles
- Cần idempotent — chạy lại mà không sợ thay đổi unintended
- Team lớn, cần convention — YAML rõ ràng, dễ review
- Cần audit trail — Ansible log từng task
- Multi-environment — dev, staging, production với inventory riêng
Code mẫu: Deploy với Ansible
| |
| |
So sánh cùng một task
Task: Restart service nếu config thay đổi
Bash:
| |
Ansible:
| |
Phân tích
| Bash | Ansible | |
|---|---|---|
| Dòng code | ~15 dòng | ~12 dòng |
| Đọc hiểu | Rất dễ | Dễ |
| Idempotent | Không — cần hash tracking | Có — register + when |
| Remote | Cần SSH loop | Built-in |
Team maturity là yếu tố quyết định
Ansible cần discipline
Ansible mạnh nhưng đòi hỏi:
- Convention rõ ràng — đặt tên task, variable thống nhất
- Code review nghiêm túc — YAML dễ viết nhưng dễ loạn
- Testing — dùng molecule hoặc Terratest
- Documentation — mỗi role phải có README
Nếu team không có những thứ này, playbook sẽ biến thành “YAML spaghetti” — khó debug hơn cả Bash.
Bash phù hợp với team linh hoạt
Bash phù hợp khi:
- Team nhỏ (< 5 người) — không cần quy trình phức tạp
- Cần fix nhanh — on-call situation
- Scripts ngắn — dưới 200 dòng
- Không muốn dependency — chỉ cần Bash và SSH
Kết hợp cả hai
Trong thực tế, nhiều team dùng cả hai:
| Task | Dùng gì |
|---|---|
| Quick fix, on-call | Bash |
| Deploy đơn giản | Bash |
| Infrastructure provisioning | Ansible |
| Configuration management | Ansible |
| Cron job đơn giản | Bash |
| Multi-server orchestration | Ansible |
Ví dụ:
| |
Ghi chú triển khai
- Đừng thần thánh hóa công cụ: Cả Bash và Ansible đều là tools. Chọn tool phù hợp với task, không phải “trend”.
- Team review: Dù dùng Bash hay Ansible, code review đều quan trọng. Bash cần check cho security, Ansible cần check cho idempotency.
- Documentation: Bash scripts nên có
--helpvà comment. Ansible roles nên có README và variable docs. - Testing: Bash khó test hơn, nhưng vẫn nên test critical scripts. Ansible có molecule cho testing.
- Progressive adoption: Bắt đầu với Bash khi team nhỏ. Khi team lớn hơn và cần structure, migrate dần sang Ansible.
Lời kết
Bash và Ansible không phải là đối thủ mà là complementary tools. Bash tuyệt vời cho quick scripts, debugging, và situations cần sự linh hoạt. Ansible tuyệt vời cho complex infrastructure, multi-server management, và teams cần convention.
Chọn công cụ phù hợp với task và maturity level của team. Đừng dùng Ansible cho task 5 dòng Bash có thể xử lý, và đừng dùng Bash cho infrastructure phức tạp cần idempotent.
Điều quan trọng nhất là hiểu strengths và weaknesses của mỗi tool để đưa ra quyết định đúng đắn trong DevOps workflow.
