Bài 2: Ansible Inventory – Danh Bạ Server Của Bạn

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][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][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: Server web1 dùng port 2222 thay vì 22 (mặc định).
  • [webservers:vars]: Biến áp dụng cho cả nhóm webservers, ở đâ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!

Điều hướng chuỗi bài viết<< Bài 1: Ansible Là Gì Mà Dân DevOps Mê Thế?
>> Bài 3: Ansbile Ad-Hoc – Lệnh Nhanh Như Chớp
Article Thumbnail
Datadog Webinar: Modernize AWS Logs at Scale

Sự kiện đang hiện hành

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận