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!