Ansible Inventory เป็นไฟล์ที่ระบุรายชื่อของ servers ที่คุณต้องการจัดการ โดยสามารถจัดกลุ่ม servers เป็น groups ต่างๆ เช่น webservers, databases, load_balancers เป็นต้น ด้วยการใช้ Inventory อย่างถูกต้อง คุณสามารถจัดการ Cloud VPS หลายเครื่องพร้อมกันได้อย่างมีประสิทธิภาพ บทความนี้จะอธิบายวิธีการสร้างและใช้ Ansible Inventory บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง
Ansible Inventory คืออะไร
Ansible Inventory เป็นไฟล์ที่เก็บรายชื่อของ servers (hosts) ที่ Ansible จะจัดการ ตัวอย่างเช่น hostname, IP address, SSH port, credentials เป็นต้น Inventory สามารถเป็นไฟล์ INI format หรือ YAML format และสามารถแบ่ง hosts ออกเป็น groups ต่างๆ เพื่อให้ง่ายต่อการจัดการ
โครงสร้าง Inventory Files
Inventory file เบื้องต้นประกอบด้วย 1) Groups – กลุ่มของ servers 2) Hosts – ชื่อหรือ IP address ของ servers 3) Variables – ตัวแปรสำหรับแต่ละ host หรือ group เช่น ansible_user, ansible_port, ansible_private_key_file
# inventory.ini - INI Format
[webservers]
web1.example.com ansible_user=ubuntu
web2.example.com ansible_user=ubuntu
web3.example.com ansible_user=ubuntu
[databases]
db1.example.com ansible_user=admin ansible_port=2222
db2.example.com ansible_user=admin ansible_port=2222
[loadbalancers]
lb1.example.com ansible_user=ubuntu
[all:vars]
ansible_private_key_file=~/.ssh/id_rsa
ansible_python_interpreter=/usr/bin/python3
# inventory.yml - YAML Format
all:
hosts:
localhost:
ansible_connection: local
children:
webservers:
hosts:
web1.example.com:
ansible_user: ubuntu
web2.example.com:
ansible_user: ubuntu
web3.example.com:
ansible_user: ubuntu
databases:
hosts:
db1.example.com:
ansible_user: admin
ansible_port: 2222
db2.example.com:
ansible_user: admin
ansible_port: 2222
loadbalancers:
hosts:
lb1.example.com:
ansible_user: ubuntu
vars:
lb_port: 80
vars:
ansible_private_key_file: ~/.ssh/id_rsa
ansible_python_interpreter: /usr/bin/python3
Host Variables (host_vars) และ Group Variables (group_vars)
สำหรับ Inventories ที่มี servers จำนวนมาก การใช้ host_vars และ group_vars ช่วยให้การจัดการตัวแปรเป็นระบบมากขึ้น โดยการสร้างโฟลเดอร์ host_vars และ group_vars ที่มีไฟล์ YAML สำหรับแต่ละ host หรือ group
# Directory structure
project/
├── inventory.ini
├── host_vars/
│ ├── web1.example.com.yml
│ ├── web2.example.com.yml
│ └── db1.example.com.yml
├── group_vars/
│ ├── webservers.yml
│ ├── databases.yml
│ └── all.yml
└── playbook.yml
# group_vars/webservers.yml
http_port: 80
https_port: 443
web_root: /var/www/html
max_clients: 200
# group_vars/databases.yml
db_port: 5432
db_user: postgres
db_backup_dir: /backups/postgres
# host_vars/web1.example.com.yml
web_env: production
web_domain: web1.example.com
web_ssl: true
# host_vars/db1.example.com.yml
db_master: true
db_replication: enabled
db_standby: db2.example.com
Dynamic Inventory
สำหรับสภาพแวดล้อมที่เปลี่ยนแปลงบ่อยๆ (เช่น cloud environments) Dynamic Inventory ช่วยให้ Ansible สามารถดึง hosts จาก external sources เช่น AWS EC2, Digital Ocean, Kubernetes เป็นต้น โดยการเขียน scripts หรือใช้ inventory plugins ที่มีอยู่แล้ว
#!/usr/bin/env python3
# dynamic_inventory.py
import json
import sys
def get_inventory():
# Example: Connect to cloud provider API
inventory = {
"webservers": {
"hosts": ["web1.example.com", "web2.example.com"],
"vars": {
"ansible_user": "ubuntu",
"ansible_python_interpreter": "/usr/bin/python3"
}
},
"databases": {
"hosts": ["db1.example.com", "db2.example.com"],
"vars": {
"ansible_user": "admin",
"ansible_port": 2222
}
},
"_meta": {
"hostvars": {
"web1.example.com": {
"app_env": "production",
"app_port": 8080
},
"db1.example.com": {
"db_master": True,
"db_standby": "db2.example.com"
}
}
}
}
return inventory
if __name__ == "__main__":
if len(sys.argv) == 2 and sys.argv[1] == "--list":
print(json.dumps(get_inventory()))
elif len(sys.argv) == 3 and sys.argv[1] == "--host":
print(json.dumps({}))
else:
sys.stderr.write("Usage: dynamic_inventory.py --list|--host ")
sys.exit(1)
# ใช้งาน
ansible-playbook -i dynamic_inventory.py playbook.yml
Inventory Patterns และ Targeting Hosts
Ansible มี syntax ที่ allow คุณ target specific hosts หรือ groups เช่น “webservers[0]” สำหรับ host แรก “webservers[0:2]” สำหรับ hosts ที่ 1-2 “all” สำหรับทุก hosts “webservers:databases” สำหรับ hosts ใน groups webservers และ databases
# Run playbook against specific group
ansible-playbook -i inventory.ini playbook.yml -l webservers
# Run playbook against specific host
ansible-playbook -i inventory.ini playbook.yml -l web1.example.com
# Run playbook against multiple groups
ansible-playbook -i inventory.ini playbook.yml -l "webservers,databases"
# Run playbook against all hosts except a group
ansible-playbook -i inventory.ini playbook.yml -l "all:!databases"
# Run playbook against hosts matching pattern
ansible -i inventory.ini -m ping 'web*'
# Run ad-hoc commands
ansible webservers -i inventory.ini -m command -a "uptime"
ansible databases -i inventory.ini -m shell -a "psql -U postgres -c 'SELECT version();'"
ansible all -i inventory.ini -m setup -a "filter=ansible_os_family"
Best Practices สำหรับ Inventory Management
1. ใช้ meaningful names สำหรับ groups และ hosts 2. แยก inventory files ตามสภาพแวดล้อม (dev, staging, production) 3. ใช้ host_vars และ group_vars เพื่อ organize variables 4. เก็บ inventory ใน version control 5. ใช้ encryption (ansible-vault) สำหรับ sensitive data เช่น passwords 6. ทำการ test connectivity ด้วย ping module ก่อน run playbooks
# Test inventory connectivity
ansible all -i inventory.ini -m ping
# View inventory
ansible-inventory -i inventory.ini --list
ansible-inventory -i inventory.ini --graph
# Encrypt sensitive variables
ansible-vault create group_vars/databases.yml
# Edit encrypted file
ansible-vault edit group_vars/databases.yml
# Run playbook with vault
ansible-playbook -i inventory.ini playbook.yml --ask-vault-pass
สรุป
Ansible Inventory เป็นกลไกหลักในการจัดการ multiple servers พร้อมกัน โดยการ organize hosts เป็น groups และใช้ variables ได้อย่างเหมาะสม คุณสามารถ scale management operations ได้อย่างมีประสิทธิภาพ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง ร่วมกับ Ansible Inventory ช่วยให้คุณจัดการ infrastructure ได้อย่างง่าย และปลอดภัย
