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
Lần trước mình đã kể bạn nghe Ansible Là Gì, và tụi mình đã thử ping server đầu tiên – cảm giác đúng “vi diệu” luôn! Nhưng mà hôm đó mình chỉ dừng lại ở một file hosts
đơn giản, kiểu như mới khai báo một server để thử chơi thôi. Hôm nay, mình muốn chia sẻ sâu hơn về Ansible Inventory DevOps, cái mà mình hay gọi vui là “danh bạ server” của bạn. Đây là nơi bạn khai báo tất cả server, nhóm chúng lại, và thậm chí thêm biến để quản lý cho pro hơn. Mình sẽ kể bạn nghe cách mình từng “loạn” vì không biết dùng inventory đúng, và hướng dẫn bạn tạo một file inventory “xịn” để quản lý đội quân server nhé!
Ansible Inventory DevOps – “Danh Bạ” Của Server
Nói đơn giản, Ansible Inventory DevOps là một file (hoặc nhiều file) nơi bạn liệt kê tất cả server mà Ansible sẽ quản lý. Bạn có thể tưởng tượng nó giống như danh bạ điện thoại – mỗi server là một contact, có tên, địa chỉ (IP), và thông tin chi tiết (user, port, v.v.). Hồi mới học Ansible, mình ngây thơ nghĩ: “Ủa, cứ gõ IP thẳng vào lệnh là được, cần gì file?”. Nhưng rồi khi phải quản lý 10 server cùng lúc, mình nhận ra không có inventory thì đúng là ác mộng.
Có lần mình quản lý một cụm 5 server cho dự án nhỏ, toàn SSH tay để kiểm tra disk. Mỗi lần gõ IP, user, port là mắt mình hoa lên, chưa kể gõ nhầm IP thì lại SSH vào server sai – mất cả buổi để debug. Sau đó, mình mới mò ra Ansible Inventory DevOps, và đời mình sang trang mới. Inventory không chỉ giúp bạn liệt kê server mà còn cho phép nhóm chúng lại (VD: web server, database server), thêm biến để tùy chỉnh, kiểu như biến “danh bạ” thành “trợ lý thông minh” vậy.
Tạo File Inventory Đơn Giản Trước Đã
Đầu tiên, mình sẽ chỉ bạn cách tạo một file inventory cơ bản, giống như ở bài 1 nhưng mở rộng hơn chút. Tạo file hosts
:
nano hosts
Gõ vào:
[webservers]
web1 ansible_host=192.168.1.10 ansible_user=ubuntu
web2 ansible_host=192.168.1.11 ansible_user=ubuntu
[dbservers]
db1 ansible_host=192.168.1.20 ansible_user=ubuntu
[webservers]
,[dbservers]
: Đây là nhóm server, giống như “nhóm bạn thân” và “nhóm đồng nghiệp” trong danh bạ.ansible_host
: IP của server (thay bằng IP thật của bạn nhé).ansible_user
: User SSH vào server.
Giờ thử ping cả hai nhóm xem:
ansible webservers -i hosts -m ping
ansible dbservers -i hosts -m ping
Nếu thấy “pong” từ cả web1, web2 và db1, là inventory của bạn đã hoạt động rồi! Mình nhớ lần đầu làm cái này, mình đặt tên nhóm là [my_little_servers]
, kiểu vừa làm vừa đùa cho vui. Nhưng sau này mới thấy đặt tên nhóm sao cho dễ hiểu là cực kỳ quan trọng – nhất là khi bạn quản lý hàng chục server.
Nhóm Server – Sắp Xếp Đội Quân Gọn Gàng
Việc nhóm server trong Ansible Inventory DevOps không chỉ để cho đẹp mà còn giúp bạn chạy lệnh có chọn lọc. Ví dụ, bạn muốn kiểm tra disk của web server thôi, không cần đụng đến database server. Hoặc bạn muốn cài Nginx cho nhóm [webservers]
và MySQL cho nhóm [dbservers]
. Nhóm giúp bạn làm việc đó dễ như trở bàn tay.
Câu chuyện thật: Có lần mình không chia nhóm, để hết server vào một đống trong inventory. Đến lúc cần restart Nginx trên mấy con web server, mình quên lọc, thế là restart cả con database server – làm database down mất 10 phút, suýt bị sếp gọi lên hỏi thăm. Từ đó, mình luôn chia nhóm rõ ràng ngay từ đầu.
Giờ thử nâng cấp file hosts
chút, thêm nhóm cha (group of groups):
[webservers]
web1 ansible_host=192.168.1.10 ansible_user=ubuntu
web2 ansible_host=192.168.1.11 ansible_user=ubuntu
[dbservers]
db1 ansible_host=192.168.1.20 ansible_user=ubuntu
[prod:children]
webservers
dbservers
[prod:children]
: Nhóm cha, chứa cả[webservers]
và[dbservers]
. Giờ bạn có thể chạy lệnh cho cả cụm production:ansible prod -i hosts -m ping
Cái này tiện lắm, nhất là khi bạn muốn kiểm tra tất cả server production cùng lúc. Mình thường chia nhóm kiểu
[prod]
và[staging]
để tránh nhầm lẫn giữa môi trường.
Thêm Biến – Linh Hoạt Hóa Mọi Thứ
Đến đây, bạn đã có inventory cơ bản, nhưng để pro hơn, Ansible Inventory DevOps cho phép thêm biến (variables). Biến giúp bạn tùy chỉnh từng server hoặc nhóm mà không cần hardcode.
Ví dụ, thêm biến vào file hosts
:
[webservers]
web1 ansible_host=192.168.1.10 ansible_user=ubuntu ansible_port=2222
web2 ansible_host=192.168.1.11 ansible_user=ubuntu
[dbservers]
db1 ansible_host=192.168.1.20 ansible_user=ubuntu
[webservers:vars]
nginx_port=8080
ansible_port=2222
: Serverweb1
dùng port 2222 thay vì 22 (mặc định).[webservers:vars]
: Biến áp dụng cho cả nhómwebservers
, ở đây lànginx_port
.
Giờ thử chạy lệnh lấy biến:
ansible web1 -i hosts -m debug -a "var=nginx_port"
Kết quả:
web1 | SUCCESS => {
"nginx_port": "8080"
}
Thấy chưa, biến nginx_port
đã áp dụng cho web1
. Sau này, khi viết playbook, bạn có thể dùng biến này để cấu hình Nginx linh hoạt – kiểu như “tôi muốn port 8080 cho web server, không cần hardcode đâu!”. Mình từng hardcode port trong Bash script, mỗi lần đổi là sửa từng file, mệt muốn xỉu. Từ ngày biết biến trong Ansible Inventory DevOps, mình tiết kiệm được cả đống thời gian.
Thực Hành Nhẹ: Kiểm Tra Disk Với Inventory
Giờ bạn đã có inventory “xịn” rồi, thử dùng nó để kiểm tra disk usage trên nhóm webservers
:
ansible webservers -i hosts -m command -a "df -h /"
Kết quả sẽ kiểu:
web1 | SUCCESS | rc=0 >>
/dev/sda1 20G 5.2G 14G 28% /
web2 | SUCCESS | rc=0 >>
/dev/sda1 20G 6.0G 13G 32% /
Nhìn output mà sướng cả mắt – chỉ một lệnh mà kiểm tra được disk của cả nhóm. So với SSH tay từng máy, Ansible Inventory DevOps đúng là “vị cứu tinh” của dân DevOps!
Mẹo Nhỏ Từ Kinh Nghiệm Thật
- Nhóm sao cho dễ hiểu: Đặt tên nhóm rõ ràng (VD:
[frontend]
,[backend]
), đừng đặt kiểu[group1]
,[group2]
– sau này bạn sẽ quên mất nó là gì. - Tách biến ra file riêng: Nếu nhiều biến, tạo file
group_vars/webservers.yml
:--- nginx_port: 8080
Rồi Ansible tự load, đỡ rối file
hosts
. - Test nhỏ trước: Thêm sai biến là lỗi ngay, mình từng khai sai
ansible_user
, SSH fail cả buổi mới phát hiện.
Trước đây lúc mới đụng Ansible, lần đầu setup inventory kiểu này, mình cảm giác như vừa “sắp xếp lại cuộc đời”. Trước đây toàn làm bừa, server nào cũng gõ tay, giờ có Ansible Inventory DevOps, mọi thứ gọn gàng như một danh bạ thông minh. Mỗi lần cần chạy lệnh cho nhóm nào, chỉ việc gọi tên nhóm – tiện không thể tả!
Tiếp Theo Là Gì?
Bài này tụi mình đã làm quen với inventory, từ cơ bản đến thêm biến cho pro. Lần sau, mình sẽ kể bạn nghe về lệnh ad-hoc – kiểu “tay nhanh hơn não” của Ansible. Bạn sẽ thấy chạy lệnh cho cả đội server dễ như thế nào, kiểu cài Nginx cho 5 máy chỉ trong 1 dòng! Chịu không?
Thử Nghiệm Nhẹ: Thêm 1-2 server nữa vào hosts
, chia nhóm, thêm biến (VD: app_version=1.0
), rồi chạy thử lệnh debug
lấy biến. Có gì thắc mắc cứ nhắn mình nhé – inventory là nền tảng, làm quen tốt thì sau này bạn “quản” cả trăm server cũng không ngán!