19.2 group_vars & host_vars σε βάθος 📁
Δομή φακέλων
Τα group_vars και host_vars είναι φάκελοι (όχι αρχεία) που ακολουθούν το inventory:
ansible/
├── hosts.ini ← inventory
├── group_vars/
│ ├── all.yml ← ισχύει για ΠΑΝΤΕΣ τους hosts
│ ├── all/ ← εναλλακτικά ως φάκελος
│ │ ├── vars.yml
│ │ └── vault.yml ← encrypted secrets
│ ├── webservers.yml ← μόνο για group "webservers"
│ ├── webservers/
│ │ ├── vars.yml
│ │ └── vault.yml
│ ├── databases.yml
│ └── production.yml ← environment group
└── host_vars/
├── nextcloud.yml ← μόνο για host "nextcloud"
├── nextcloud/
│ ├── vars.yml
│ └── vault.yml
└── db-01.yml
💡 Φάκελος αντί αρχείου: Όταν έχεις secrets, χωρίζεις
vars.yml(plaintext) απόvault.yml(encrypted). Το Ansible φορτώνει ΟΛΑ τα αρχεία μέσα στον φάκελο.
group_vars/all — Κοινές μεταβλητές
# group_vars/all.yml
# Ισχύει για ΠΑΝΤΕΣ τους hosts
ansible_user: ansible
ansible_ssh_private_key_file: ~/.ssh/ansible_ed25519
ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
# Timezone
system_timezone: Europe/Athens
# NTP
ntp_servers:
- 0.pool.ntp.org
- 1.pool.ntp.org
# Γενικά
admin_email: admin@example.com
company_name: MyCompany
group_vars per group — Environment config
# group_vars/webservers.yml
nginx_port: 80
nginx_worker_processes: auto
nginx_log_level: warn
app_max_connections: 1000
# group_vars/databases.yml
postgres_version: 15
postgres_port: 5432
postgres_max_connections: 100
postgres_shared_buffers: "256MB"
# group_vars/production.yml
# (αν έχεις group [production] στο inventory)
app_env: production
app_debug: false
log_level: error
backup_enabled: true
# group_vars/staging.yml
app_env: staging
app_debug: true
log_level: debug
backup_enabled: false
host_vars — Host-specific config
# host_vars/nextcloud.yml
# Μόνο για τον host "nextcloud"
ansible_host: 192.168.1.10
ansible_port: 2022 # ← non-standard SSH port
# Host-specific overrides
nginx_port: 8080 # ← override του group default (80)
app_memory: "2G" # ← αυτός ο server έχει περισσότερη RAM
# Certbot
certbot_domain: nextcloud.example.com
certbot_email: admin@example.com
Φάκελος με vault — Secrets ανά group/host
group_vars/
└── all/
├── vars.yml ← plaintext (στο git)
└── vault.yml ← encrypted (στο git)
# group_vars/all/vars.yml
db_name: mydb
db_user: appuser
# db_pass: ΔΕΝ ΤΟ ΒΑΖΕΙΣ ΕΔΩ!
# group_vars/all/vault.yml (encrypted)
vault_db_pass: "StrongP@ssw0rd!"
vault_api_key: "sk-abc123..."
vault_smtp_pass: "EmailP@ss!"
# Encrypt vault.yml
ansible-vault encrypt group_vars/all/vault.yml
# Edit encrypted
ansible-vault edit group_vars/all/vault.yml
# Εκτέλεση
ansible-playbook site.yml --ask-vault-pass
Σειρά φόρτωσης group_vars
Αν ένας host ανήκει σε πολλές ομάδες, όλα τα αντίστοιχα group_vars φορτώνονται:
# hosts.ini
[webservers]
nextcloud
[production]
nextcloud
[nextcloud:vars] ← inline vars (χαμηλότερη προτεραιότητα)
ansible_port=2022
Φόρτωση για host "nextcloud":
1. group_vars/all.yml ← πρώτα
2. group_vars/webservers.yml ← αλφαβητικά
3. group_vars/production.yml ← αλφαβητικά
4. host_vars/nextcloud.yml ← τελευταίο (κερδίζει)
⚠️ Αν δύο groups ορίζουν ίδια μεταβλητή: Η σειρά είναι αλφαβητική (όχι σειρά inventory). Προτίμα
host_varsγια explicit override.
Σύνοψη 19.2
group_vars & host_vars
│
├── Δομή:
│ ├── group_vars/all.yml → όλοι
│ ├── group_vars/<group>.yml → συγκεκριμένη ομάδα
│ └── host_vars/<hostname>.yml → συγκεκριμένος host
│
├── Φάκελος (αντί αρχείου):
│ ├── vars.yml → plaintext (git)
│ └── vault.yml → encrypted (git, ασφαλές)
│
├── Σειρά φόρτωσης:
│ all → groups (αλφαβητικά) → host_vars
│ → host_vars κερδίζει groups
│
└── Best practices:
✅ all.yml → κοινές ρυθμίσεις
✅ group_vars → environment, role-based config
✅ host_vars → host-specific overrides
✅ vault.yml → secrets ποτέ plaintext!