Inventory: Tĩnh, Động, Nhóm và Biến

K
Kai··4 min read

Inventory là danh sách các host Ansible quản lý và cách tổ chức chúng. Mọi playbook đều áp lên một tập host trong inventory, nên hiểu inventory là nền tảng. Bài này đi từ inventory tĩnh đơn giản tới động cho cloud.

Inventory tĩnh: INI và YAML

Bài 2 đã dùng inventory INI tối giản. Inventory hỗ trợ hai định dạng — INI (gọn) và YAML (rõ cấu trúc khi phức tạp).

INI:

[web]
web1 ansible_host=10.0.0.11
web2 ansible_host=10.0.0.12

[db]
db1 ansible_host=10.0.0.21

YAML tương đương:

all:
  children:
    web:
      hosts:
        web1:
          ansible_host: 10.0.0.11
        web2:
          ansible_host: 10.0.0.12
    db:
      hosts:
        db1:
          ansible_host: 10.0.0.21

web1tên gợi nhớ (alias) của host; ansible_host là địa chỉ thật. Tách hai thứ này cho phép đặt tên dễ nhớ và đổi IP mà không đổi playbook.

Nhóm: tổ chức host

Host được gom thành nhóm (web, db...). Một host có thể thuộc nhiều nhóm, và nhóm có thể lồng nhau (children). Xem cấu trúc bằng ansible-inventory:

ansible-inventory --graph
@all:
  |--@ungrouped:
  |--@web:
  |  |--lab
  |--@db:
  |  |--lab

Ở đây host lab thuộc cả web lẫn db. Hai nhóm đặc biệt luôn có sẵn: all (mọi host) và ungrouped (host không thuộc nhóm nào). Nhóm giúp bạn áp playbook đúng loại máy: "cài nginx cho nhóm web", "cấu hình postgres cho nhóm db".

Biến: gán theo host và theo nhóm

Bạn gán biến cho host/nhóm để playbook dùng (Bài 6 đào sâu biến). Cách sạch nhất là dùng hai thư mục đặc biệt cạnh inventory:

  • group_vars/<tên_nhóm>.yml — biến cho cả nhóm.
  • host_vars/<tên_host>.yml — biến cho một host.

Ví dụ group_vars/web.yml:

http_port: 8080
app_env: production

Mọi host trong nhóm web tự nhận http_portapp_env. Kiểm tra biến đã gộp vào host:

ansible-inventory --host lab
{
    "ansible_host": "203.0.113.10",
    "app_env": "production",
    "http_port": 8080
}

Host lab (thuộc web) nhận đủ biến từ group_vars. Khi host thuộc nhiều nhóm có biến trùng tên, có thứ tự ưu tiên quyết định giá trị nào thắng — chủ đề Bài 6. Đặt biến chung ở group_vars/all.yml, biến riêng ở nhóm/host cụ thể.

Pattern: nhắm đúng mục tiêu

Khi chạy playbook/ad-hoc, bạn chỉ định pattern — host/nhóm nào áp lên:

ansible web --list-hosts          # mọi host nhóm web
ansible all --list-hosts          # tất cả
ansible 'web:db' --list-hosts     # web HOẶC db (hợp)
ansible 'web:&db' --list-hosts    # vừa web VỪA db (giao)
ansible 'web:!db' --list-hosts    # web NHƯNG KHÔNG db (trừ)
ansible 'web*' --list-hosts       # khớp tên theo wildcard

Các toán tử : (hoặc), :& (và), :! (loại trừ) cho phép nhắm chính xác — ví dụ "mọi web trừ host đang bảo trì". --list-hosts xem trước pattern khớp ai trước khi chạy thật.

Inventory động: tự khám phá host trên cloud

Inventory tĩnh ổn khi host cố định. Nhưng trên cloud, máy được tạo/xóa liên tục — cập nhật tay danh sách IP là bất khả thi. Inventory động (dynamic inventory) giải quyết: một plugin tự truy vấn nguồn (AWS, GCP, Kubernetes...) để lấy host theo thời gian thực.

Với AWS, plugin amazon.aws.aws_ec2 lấy các EC2 đang chạy. File inventory_aws.yml:

plugin: amazon.aws.aws_ec2
regions:
  - ap-southeast-1
keyed_groups:
  - key: tags.Role        # tự tạo nhóm theo tag "Role" của instance
    prefix: role
filters:
  instance-state-name: running

Chạy ansible-inventory -i inventory_aws.yml --graph sẽ liệt kê các EC2 đang chạy, tự nhóm theo tag. Ưu điểm lớn: bạn gắn tag Role=web cho instance trên AWS, Ansible tự đưa nó vào nhóm role_web — không cần sửa file inventory khi scale. (Cần cài collection amazon.aws và cấu hình thông tin AWS — Bài 9 nói về collection.)

Khi nào dùng cái nào: tĩnh cho môi trường nhỏ/cố định (lab, vài server); động cho cloud/auto-scaling nơi host thay đổi liên tục. Nhiều dự án dùng cả hai.

🧹 Dọn dẹp

Inventory chỉ là file văn bản, không tạo tài nguyên gì. Code mẫu (inventory INI/YAML, group_vars) ở repo nghiadaulau/ansible-series, thư mục 03-inventory.

Tổng kết

Inventory liệt kê host Ansible quản lý. Viết tĩnh (INI hoặc YAML), gom host thành nhóm (lồng nhau được, một host nhiều nhóm), gán biến qua group_vars/host_vars/. Nhắm mục tiêu bằng pattern với toán tử : :& :!. Cho cloud, dùng inventory động (plugin như aws_ec2) để tự khám phá và nhóm host theo tag. ansible-inventory --graph/--host để kiểm tra.

Có host và biến rồi, giờ ta viết thứ chính của Ansible: playbook. Bài 4.