Inventory trong Ansible – Bài 3

Trong bài viết này, chúng ta sẽ cùng tìm hiểu về Ansible Inventory – một phần cực kỳ quan trọng giúp Ansible biết được nó cần cấu hình những máy nào.

Xem thêm:

Ansible là gì? Vì sao chúng ta lại cần nó – Bài 1

Làm quen với YAML – Bài 2

1. Inventory là gì?

Inventory là một file chứa danh sách các máy chủ (host) mà Ansible sẽ kết nối và cấu hình. Trong file này, ta khai báo:

  • Địa chỉ IP hoặc domain của máy chủ
  • Tên đăng nhập
  • Mật khẩu hoặc public key để đăng nhập
  • Các thông tin khác như port, phương thức kết nối,…

Đây là cách để ta “nói” cho Ansible biết: “Ê, tao muốn mày cấu hình mấy cái máy này nè, dùng thông tin đăng nhập này nha!”

2. Tại sao cần Inventory?

Ansible là một công cụ agentless, tức là bạn không cần cài gì thêm trên máy chủ cần cấu hình. Chỉ cần SSH hoặc WinRM là Ansible có thể “bắt chuyện” với máy đó được rồi. Mọi thông tin kết nối được mô tả trong file Inventory.

3. Các định dạng Inventory trong Ansible

Ansible hỗ trợ 2 định dạng cho file inventory:

Định dạng Ưu điểm Phù hợp
INI Gọn nhẹ, dễ viết Dự án nhỏ hoặc dùng cá nhân
YAML Cấu trúc rõ ràng, chi tiết Dự án lớn, nhiều tầng

Ví dụ định dạng INI:

[web]
192.168.1.5 ansible_user=ubuntu ansible_ssh_pass=123456

[db]
192.168.1.6 ansible_user=ubuntu ansible_ssh_pass=123456

Còn YAML thì rõ ràng hơn nhưng dài hơn:

all:
  children:
    web:
      hosts:
        web1:
          ansible_host: 192.168.1.5
          ansible_user: ubuntu
    db:
      hosts:
        db1:
          ansible_host: 192.168.1.6
          ansible_user: ubuntu

4. Các parameter phổ biến trong Inventory

Dưới đây là 6 tham số bạn sẽ dùng nhiều khi khai báo host:

Tham số Ý nghĩa
ansible_host Địa chỉ IP hoặc tên máy chủ
ansible_user Tên đăng nhập SSH
ansible_ssh_pass Mật khẩu đăng nhập SSH
ansible_port Port SSH (thường là 22 cho Linux, 5985 cho Windows)
ansible_connection Phương thức kết nối (ssh, winrm, local)
ansible_become Dùng sudo để chạy lệnh (true/false)

5. Thực hành viết Inventory

5.1. Cấu trúc thư mục

ansible-lab/
├── inventories/
│   ├── inventory.ini
│   └── inventory.yaml
├── playbooks/
│   └── install_webserver.yaml
├── roles/
├── group_vars/
├── host_vars/
└── ansible.cfg

5.2. Viết file inventory.ini

[server]
192.168.1.5 ansible_user=ubuntu ansible_ssh_pass=123456
192.168.1.6 ansible_user=ubuntu ansible_ssh_pass=123456

Bạn có thể đặt tên riêng để dễ dùng:

[server]
web1 ansible_host=192.168.1.5 ansible_user=ubuntu
db ansible_host=192.168.1.6 ansible_user=ubuntu

Tạo nhóm con và nhóm cha:

[web]
web1 ansible_host=192.168.1.5 ansible_user=ubuntu

[db]
db ansible_host=192.168.1.6 ansible_user=ubuntu

[server:children]
web
db

Chạy lệnh kiểm tra:

ansible all -i inventories/inventory.ini -m ping

Nếu gặp lỗi fingerprint, chỉ cần SSH vào máy đó 1 lần để xác nhận:

ssh ubuntu@192.168.1.5

Chọn “yes” là xong.

Ngoài ra, bạn có thể tạo key:

ssh-keygen -t rsa

Copy key qua máy đích:

ssh-copy-id ubuntu@192.168.1.6

Lúc này bạn có thể bỏ qua ansible_ssh_pass trong inventory.

5.3. Viết Inventory bằng YAML

all:
  children:
    web:
      hosts:
        web1:
          ansible_host: 192.168.1.5
          ansible_user: ubuntu
    db:
      hosts:
        db1:
          ansible_host: 192.168.1.6
          ansible_user: ubuntu
    server:
      children:
        - web
        - db

Chạy:

ansible server -i inventories/inventory.ini -m ping

Cảm ơn bạn đã tham khảo ansible tutorial trên ttnguyen.net

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em