Variables Magic
Trong bài này, mình đi thẳng vào một câu hỏi thực chiến:
Làm sao host
web1đọc được biến chỉ định trênweb2?
Câu trả lời là dùng magic variables.
1) Nhắc nhanh về variable interpolation
Khi playbook bắt đầu, Ansible:
- tạo execution context cho từng host
- gom biến từ inventory/group/host/other sources
- gắn biến vào đúng host
Vì vậy, biến định nghĩa ở web2 mặc định không tự có ở web1 hay web3.
Inventory variables
│
▼
Interpolation stage
│
├── host web1 -> vars of web1
├── host web2 -> vars of web2
└── host web3 -> vars of web3
2) hostvars: đọc biến của host khác
Nếu dns_server chỉ có trên web2, từ host khác bạn có thể lấy như sau:
Hoặc cú pháp bracket (tương đương):
Bạn cũng có thể lấy các giá trị khác như:
ansible_host- facts (nếu
gather_facts: true)
Ví dụ:
3) groups: lấy danh sách host của một group
groups trả về các host trong group.
Hữu ích khi bạn cần loop theo một nhóm cụ thể.
4) group_names: host hiện tại thuộc những group nào?
group_names trả về danh sách group của current host.
Ví dụ chạy trên web1 có thể ra:
['web_servers', 'americas']
Cực hữu ích khi cần branch logic theo membership.
5) inventory_hostname: tên host theo inventory
inventory_hostname là tên host bạn đặt trong inventory (không nhất thiết là hostname/FQDN thật trên máy).
Ví dụ inventory:
web1 ansible_host=172.20.1.100
Thì:
inventory_hostname=>web1ansible_host=>172.20.1.100
6) Mini playbook demo
- name: Demo magic variables
hosts: web_servers
gather_facts: false
tasks:
- name: Show current host and groups
debug:
msg: "host=, groups="
- name: Read dns_server from web2
debug:
msg: "dns from web2 = "
when: "'web2' in hostvars and 'dns_server' in hostvars['web2']"
7) Lưu ý để tránh lỗi thường gặp
hostvars['x']chỉ có dữ liệu nếu hostxcó trong inventory runtime- Truy cập facts của host khác cần
gather_factsphù hợp - Luôn check key tồn tại trước khi đọc sâu (
in,default,when)
Use hostvars carefully:
check host exists
check key exists
then read value
Kết luận
Magic variables giúp playbook “nhìn rộng” hơn phạm vi một host:
hostvars: đọc data host khácgroups: host list theo groupgroup_names: group list của host hiện tạiinventory_hostname: alias host trong inventory
Nắm chắc 4 biến này sẽ giúp bạn viết playbook linh hoạt hơn rất nhiều, đặc biệt khi automation đa host, đa region và đa role.