Ansible Là Gì và Vì Sao Nên Dùng
This is the first part
Trong series này chúng ta học Ansible từ nền tảng tới nâng cao — đến mức tự viết module và thiết kế dự án theo best practice. Phần hands-on có code thật, thực hành trên một máy chủ EC2. Trước khi cài đặt, bài này giải thích Ansible là gì và vì sao nó đáng học.
Vấn đề: cấu hình nhiều máy chủ
Bạn có một server: SSH vào, cài phần mềm, sửa cấu hình, khởi động dịch vụ — bằng tay. Ổn. Giờ bạn có mười server, rồi một trăm. Làm tay là bất khả thi: tốn thời gian, dễ sai, và mỗi máy dần khác nhau một chút (gọi là configuration drift — trôi cấu hình). "Server số 7 sao lại lỗi?" — vì ai đó sửa tay nó khác các máy còn lại.
Viết script bash để tự động? Tốt hơn, nhưng script khó đảm bảo chạy lại nhiều lần vẫn an toàn: chạy script cài nginx hai lần có thể lỗi, hoặc bạn phải tự viết đủ kiểm tra "đã cài chưa". Và script bash khó đọc, khó tái dùng khi hệ thống lớn.
Quản lý cấu hình (configuration management) là lời giải: mô tả trạng thái mong muốn của hệ thống một cách khai báo, rồi để công cụ lo đưa mọi máy về đúng trạng thái đó. Ansible là một trong những công cụ phổ biến nhất cho việc này.
Ansible là gì
Ansible là công cụ tự động hóa: bạn viết ra trạng thái mong muốn ("nginx phải được cài và đang chạy", "file cấu hình này phải có nội dung kia") trong các file YAML gọi là playbook, rồi Ansible áp lên hàng loạt máy chủ cùng lúc.
Hai đặc điểm làm nên Ansible — và là hai từ khóa quan trọng nhất của cả series:
1. Agentless (không cần cài agent)
Nhiều công cụ cùng loại (Chef, Puppet) cần cài một agent chạy nền trên mỗi máy được quản lý. Ansible thì không: nó kết nối tới máy đích qua SSH có sẵn (và Python có sẵn trên máy đích) để thực thi. Bạn chỉ cần cài Ansible ở một máy điều khiển (control node), còn các máy đích không cần cài gì thêm.
Hệ quả thực tế: bắt đầu rất nhanh (không phải triển khai agent khắp nơi), và không có thêm dịch vụ nền nào để bảo trì/bảo mật trên máy đích. Đây là lý do lớn nhất khiến Ansible phổ biến.
2. Idempotent (chạy nhiều lần vẫn an toàn)
Idempotent nghĩa là chạy một thao tác nhiều lần cho cùng kết quả như chạy một lần. Ansible mô tả trạng thái mong muốn, không phải các bước: bạn nói "nginx phải được cài", không phải "chạy lệnh apt install nginx". Khi chạy:
- Nếu nginx chưa cài → Ansible cài (báo
changed). - Nếu nginx đã cài → Ansible không làm gì (báo
ok).
Chạy playbook mười lần liên tiếp cũng an toàn — nó chỉ thay đổi những gì chưa đúng trạng thái. Đây là khác biệt cốt lõi so với script bash, và là tính chất giúp bạn yên tâm chạy lại playbook bất cứ lúc nào. Ta sẽ đào sâu idempotency ở Bài 5.
Các khái niệm cốt lõi
Năm khái niệm sẽ gặp liên tục:
- Control node — máy cài Ansible, nơi bạn chạy lệnh. (Máy của bạn, hoặc một server CI.)
- Managed node (host) — máy đích được Ansible quản lý, kết nối qua SSH.
- Inventory — danh sách các host và cách nhóm chúng (Bài 3).
- Module — đơn vị công việc Ansible thực thi (cài gói, copy file, quản lý dịch vụ...). Ansible có sẵn hàng nghìn module; bạn cũng tự viết được (Bài 10).
- Task — một lần gọi module với tham số cụ thể.
- Playbook — file YAML gom các task để áp lên các host (Bài 4).
- Role — cách đóng gói playbook/biến/template thành đơn vị tái sử dụng (Bài 8).
Quan hệ: bạn viết playbook gồm nhiều task, mỗi task gọi một module, áp lên các host trong inventory, từ control node qua SSH.
Vì sao nên học Ansible
- Phổ biến trong DevOps: chuẩn de facto cho cấu hình server, triển khai ứng dụng, tự động hóa vận hành.
- Dễ bắt đầu: YAML đọc được như tiếng Anh, agentless nên không cần dựng hạ tầng.
- Bổ trợ các kỹ năng khác trong các series trước: cấu hình EC2 (series AWS), chuẩn bị host chạy Docker (series Docker), tự động hóa thay cho SSH/script tay (series Linux).
Hands-on: repo và máy chủ
Series này thiên về thực hành. Hai thứ đi kèm:
- Code mẫu (playbook, role, custom module, dự án best-practice) được lưu tại github.com/nghiadaulau/ansible-series — bạn clone về tham khảo và chạy theo.
- Máy chủ thực hành: ta dùng một EC2 (Bài 2 sẽ dựng) làm managed node để Ansible quản lý thật. Cuối series ta xóa nó đi (như thói quen dọn dẹp ở series AWS — tránh tốn tiền).
Lộ trình của series
Nền tảng:
- Kiến trúc Ansible — control node, inventory, module, SSH; chính xác chuyện gì xảy ra khi chạy một playbook (đào sâu cơ chế thực thi).
- Cài đặt và lệnh ad-hoc đầu tiên — dựng control node + EC2, chạy module
ping. - Inventory — host, nhóm, biến, inventory tĩnh và động.
- Playbook — cấu trúc YAML, play, task; chạy playbook đầu tiên.
- Module và idempotency — module thực thi ra sao bên trong, vì sao idempotent.
- Biến, facts và template — biến, gather facts, Jinja2, thứ tự ưu tiên.
- Handlers, loops, conditionals — notify, vòng lặp, điều kiện, block/rescue.
Tổ chức và mở rộng:
- Roles — đóng gói code tái sử dụng.
- Ansible Galaxy và Collections — đóng gói/phân phối hiện đại, FQCN.
- Ansible Vault — quản lý bí mật an toàn.
- Viết custom module — tự viết module bằng Python.
- Mở rộng Ansible: filter, lookup, callback plugins — extensibility sâu hơn module.
Nâng cao và best practice:
- Tối ưu và chiến lược thực thi — strategy, delegation, serial/rolling update, async, check mode, tags.
- Kiểm thử với Molecule — test role bài bản bằng container.
- Best practices — cấu trúc dự án, thiết kế role, ansible-lint.
- Một dự án hoàn chỉnh + tổng kết — ghép tất cả, dọn dẹp EC2, hướng học tiếp.
Cần chuẩn bị
- Một máy để làm control node (Bài 2 cài Ansible). Ansible chạy trên Linux/macOS; Windows dùng WSL.
- Quen dòng lệnh và SSH (nhớ series Linux Bài 14) — Ansible kết nối host qua SSH.
- Một tài khoản AWS để dựng EC2 thực hành (hoặc bất kỳ máy Linux nào bạn SSH được).
Hết bài này chưa cần làm gì. Bài 1 đi vào kiến trúc: chính xác thì Ansible làm gì khi bạn chạy một playbook, và vì sao "agentless qua SSH" lại quan trọng.
This is the first part