Inventory (hay còn gọi là tệp lưu trữ) là danh sách các máy chủ hoặc thiết bị ( remote host) mà Ansible sẽ quản lý và thực hiện các tác vụ. Inventory chứa thông tin về địa chỉ IP hoặc tên miền của các máy chủ, cùng với các nhóm và các biến liên quan đến từng máy chủ. Điều này cho phép Ansible kết nối, định cấu hình và thực hiện các lệnh hoặc playbook trên các máy chủ này.
Inventory có thể được định nghĩa trong một tệp văn bản (thường là hosts hoặc inventory) hoặc có thể được lưu trữ động (dynamic inventory) từ các nguồn khác như các dịch vụ đám mây.
Tệp inventory trong Ansible được viết bằng ngôn ngữ cấu hình văn bản thuần túy (plain text), không phải là một ngôn ngữ lập trình cụ thể. Cấu trúc của nó rất đơn giản và thường tuân theo định dạng INI (tệp văn bản với các nhóm và khóa-giá trị).
Ngoài ra cũng có thể viết inventory bằng YAML, một định dạng dữ liệu dễ đọc thường được sử dụng trong Ansible, đặc biệt trong các playbook.
Một lưu ý quan trọng rằng: Nếu Ansible không có Inventory file, chính Ansible cũng sẽ không biết mình có thể quản lý được những hệ thống nào.
Làm thế nào để xây dựng Inventory?
Ở bài trước mình cũng đã đề cập qua về việc khai báo Inventory với remote host sử dụng SSH Password. Bài này mình sẽ tập trung ở SSH Key.
Khi sử dụng SSH Key thì chắc chắn bạn cần lưu file chứa private key của các remote server trên máy control server.
Sau khi thực hiện câu lệnh Ansible bạn sẽ cần nhập passphrase của SSH Key (nếu có).
Ở đây mình đã nhập sai passphrase của server A nên Ansible đã không kết nối được đến mà chỉ kết nối đến được server B.
Trong trường hợp mỗi remote server là 1 private key khác nhau, bạn cần khai báo đúng đường dẫn key trong inventory. Đồng thời đối với các câu lệnh Ansible sẽ cần nhập đúng passphrase cho từng server. Việc nhập passphrase như vậy khá bất tiện, dễ nhầm lẫn.
Vậy cách để bỏ qua passphrase trong Ansible là gì?
Trong Ansible không có option bỏ qua passphrase. Tuy nhiên, bạn có thể sử dụng tính năng của SSH là lưu trước passphrase cho private key trên control server để Ansible sẽ không yêu cầu nhập cho các lần sau.
Đầu tiên khởi động ssh-agent ở chế độ background:
eval "$(ssh-agent -s)"
Tiếp đến thêm SSH private key vào ssh-agent và tiến hành nhập passphrase:
ssh-add <path_to_private_key>
Cách tổ chức và quản lý inventory
Đặt vấn đề
Giả sử bạn đang quản lý một hệ thống với 50 máy chủ, được phân thành 3 loại chính: máy chủ web, máy chủ cơ sở dữ liệu và máy chủ kiểm thử. Bạn cần thực hiện các tác vụ cấu hình khác nhau trên từng nhóm máy chủ và đôi khi cần quản lý tất cả máy chủ cùng một lúc. Để làm điều này, bạn sẽ cần chuẩn hoá Inventory với groups, variables và grouping groups.
Tuỳ theo nhu cầu hiện tại mà bạn có thể chia các servers thành các groups khác nhau để quản lý. Chẳng hạn phân chia theo chức năng, vị trí địa lý thành từng nhóm server.
Dưới đây là ví dụ cụ thể. Ở đây mình có các servers sẽ được phân chia thành 3 nhóm chính:
Group webserver: chứa các máy chủ được cài đặt, triển khai, vận hành webserver
Group databaseserver: quản lý các máy chủ database
Group tester: thực hiện nhiệm vụ kiểm thử sản phẩm
[webserver] #Group webserverweb1 ansible_ssh_host=192.168.33.20 web2 ansible_ssh_host=192.168.33.21 web3 ansible_ssh_host=192.168.33.22 [databaseserver] #Group databaseserverdb1 ansible_ssh_host=192.168.33.23 db2 ansible_ssh_host=192.168.33.24 db3 ansible_ssh_host=192.168.33.25 db4 ansible_ssh_host=192.168.33.26 [tester] #Group testertest1 ansible_ssh_host=192.168.33.27 test2 ansible_ssh_host=192.168.33.28 test3 ansible_ssh_host=192.168.33.29[datacenter:children] #Group datacenterwebserverdatabaserver[all:vars] #Thiết lập biến vars dùng chung cho các serversansible_ssh_user=rootansible_ssh_port=2210ansible_ssh_private_key_file=/root/.ssh/linux-unity.key
Biến vars trong inventory
vars dùng để định nghĩa biến chung cho các máy chủ hoặc nhóm máy chủ trong inventory. Điều này giúp bạn không cần phải lặp lại từng biến cho các máy chủ từ đó inventory file cũng gọn gàng và dễ nhìn, dễ quản lý hơn.
Trong ví dụ trên, các server này sử dụng cùng 1 thông tin SSH nên mình sẽ tạo biến var để khai báo chung cho toàn bộ.
[<name_of_group>:vars]...
Phân chia inventory theo groups
Để thực hiện phân chia groups, bạn thực hiện cú pháp sau:
[name_of_group]<server 1>...<server n>
Ở đây mình sẽ thực hiện câu lệnh Ansible để lấy thông tin OS đang sử dụng trên group tester thông qua module setup.
Dưới đây mình cần lấy thông tin OS của group webserver và databaseserver nên đã gom 2 group này thành group datacenter và thực hiện câu lệnh Ansible.
Lúc này các server trong 2 group webserver và databaseserver đều trả về kết quả như mong muốn.
Vậy là chúng ta đã nắm rõ về Inventory – một thành phần cơ bản và thiết yếu của Ansible. Để tìm hiểu sâu hơn, bạn có thể tham khảo chi tiết tại: Ansible Inventory Guide.