(Phần 2) Inventory trong Ansible
Tiếp theo series liên quan đến Ansible. Ở bài hôm nay mình sẽ giới thiệu đến bạn làm quen Inventory trong Ansible.
Ansible Inventory là gì?
Một inventory chỉ định và mô tả tất cả các thiết bị mục tiêu (tức là máy chủ) trong môi trường Ansible. Inventory có thể là một tệp đơn lẻ hoặc một loạt các tệp, thường được viết theo định dạng INI hoặc YAML.
Các biến được định nghĩa trong các tệp mà Ansible sẽ sử dụng để giao tiếp và cấu hình các hệ thống mục tiêu. Inventory có thể chứa nhiều máy chủ khác nhau của các nền tảng, hệ điều hành và nhà sản xuất khác nhau. Ansible không quan tâm đến bản chất của các thiết bị trong inventory, chỉ quan tâm đến việc inventory được định dạng chính xác!
Ansible cung cấp một inventory mặc định với tệp , được sử dụng trong các lệnh Ansible Engine bất cứ khi nào inventory không được chỉ định rõ ràng. Vị trí của inventory mặc định có thể được thiết lập bằng cách sửa đổi tệp cấu hình Ansible . Trong khi Ansible cung cấp tùy chọn sử dụng inventory mặc định
/etc/ansible/hosts
Làm thế nào để xây dựng Inventory
Danh sách các host được quản lý bởi ansible, file này nằm tại đường dẫn /etc/ansible/hosts . Các hosts có thể được viết tắt ở dạng partern, hoặc có thể được gom nhóm lại với nhau thành một Group. Ngoài việc lưu các hosts thì file còn lưu một loạt các biến cấu hình cho việc hoạt động của ansible. Và định dạng ini hoặc yaml
Cấu hình ví dụ
#Sample Inventory File
Server1.phuongtruong.site
Server2.phuongtruong.site
[mail]
Server3.phuongtruong.site
Server4.phuongtruong.site
[db]
Server5.phuongtruong.site
Server6.phuongtruong.site
[web]
Server7.phuongtruong.site
Server8.phuongtruong.site
[all_servers:children]
mail
db
web
Trong cấu hình cách khai báo trên với [mail], [db], [web]. Đây là cách khai báo cho 1 group các server với nhau. [mail] là tên group. Bạn có thể sử dụng lệnh ansible-inventory để xác thực và lấy thông tin về kiểm kê Ansible của mình:
ansible-inventory -i inventory --list
Bây giờ mình sẽ chạy test với lệnh ping trên group [mail]
ansible mail -m ping
Thao tác phía dưới sẽ thực thi ping mô-đun trên tất cả các máy chủ được liệt kê trong tệp kiểm kê tùy chỉnh của bạn.
ansible all -i inventory -m ping
Còn [all_servers:children] là cách khai báo group các group với nhau.
YAML và làm quen với YAML
YAML là một ngôn gnữ cấu hình định dạng dữ liệu. Hầu như tất cả playbooks trong Ansible được viết bằng YAML. Trong ansible thì phần này khá quan trong vì các phần còn lại hầu như phụ thuộc hoàn toàn vào YAML. Playbook Ansible ( Mình sẽ nói thêm vào Phần sau 😀) được viết theo định dạng cụ thể được gọi là YAML. Nếu bạn đã làm việc với các định dạng cấu trúc dữ liệu khác như XML hoặc JSON, bạn sẽ có thể dễ dàng học nó. Cũng đừng lo lắng nếu bạn chưa biết gì 😆, ban đầu khi học nó mình cũng khá rối tuy nhiên sau một thời gian mình thấy nó thật sự rất đơn giản. File YAML được dùng để thể hiện dữ liệu. Dưới đây là so sánh nhanh dữ liệu mẫu ở ba định dạng khác nhau.
Trong YAML có kiểu để biểu diễn giá trị như sau:
- Key Value Pair (Cặp khoá vs giá trị):
- Dữ liệu được thể hiện bởi kiểu khoá và giá trị (key và value). Trong YAML, khóa và giá trị được phân tách bằng dấu hai chấm (
. Luôn phải có khoảng trắng theo sau dấu hai chấm.
- Mảng trong YAML: Các phần tử trong mảng sẽ được thể hiện bởi dấu gạch ngang ( – ). Cần có khoảng trắng trước mỗi mục. Số lượng khoảng trắng cần bằng nhau trước các phần tử của một mảng. Chúng ta hãy xem xét kỹ hơn về các dấu khoảng trắng trong YAML.
Ví dụ ở đây ta có một object là Nha. Trong đó có 3 thuộc tính là phongkhach, phongngu và bep đều ngang hàng với nhau
Nha:
Phong khach: 1
Phong ngu: 3
Bep: 1
Lưu ý số lượng khoảng trắng trước mỗi thuộc tính sẽ chỉ ra mối quan hệ cha con. Như ở đây, trước 3 thuộc tính đó có cùng số khoảng trắng, nghĩa là 3 thuộc tính đó nằm trong Nha. Nhưng điều gì sẽ xảy ra nếu chúng ta có thêm không gian cho Phong ngu và bep
Nha:
Phong khach: 1
Phong ngu: 3
Bep: 1
Theo cấu trúc trên thì lúc này Phong ngu và bep sẽ là con của thuộc tính Phong khach và Phong khach là thuộc tính con của Nha. Vì vậy, số lượng khoảng trắng trong YAML rất quan trọng. Đôi lúc bạn có thể chạy script bị báo lỗi nếu nhầm khoảng trắng với dấu tab.
Dạng Dictionary trong YAML:
Dạng này chỉ cần biểu diễn khoảng trắng trước các thuộc tính của object. Điểm khác biệt của dạng Dictionary và Array là các thuộc tính liệt kê dạng Dictionary thì không có thứ tự. Trong khi Array thì ngược lại. Nên là ví dụ bạn khai báo như:
Tasks:
- Intall docker
- Start docker
Sẽ khác với
Tasks:
- Start docker
- Intall docker
Ví dụ trên được viết theo dạng Array, tức ansible sẽ đọc tuần tự từ trên xuống. Như vậy nếu start docker trước khi install docker thì sẽ xảy ra lỗi vì hệ thống không tìm thấy service docker để start.
💯