Variable #
Variabel dalam inventory adalah mekanisme yang membuat satu playbook bisa berperilaku berbeda di server yang berbeda. Server web punya http_port: 80, server staging punya db_host: staging-db, server produksi punya db_host: prod-db — semuanya bisa dijalankan dengan playbook yang sama karena variabelnya berbeda. Memahami cara mendefinisikan, mengorganisir, dan mem-prioritaskan variabel inventory adalah keterampilan yang akan kamu gunakan di setiap project Ansible.
Tiga Cara Mendefinisikan Variabel Inventory #
Ada tiga tempat untuk mendefinisikan variabel yang berhubungan dengan inventory, masing-masing dengan kelebihan dan trade-off-nya.
1. Langsung di File Inventory #
Cara paling cepat tapi paling sulit dikelola saat variabel mulai banyak:
# hosts.ini — variabel inline di file inventory
[webservers]
web-01 ansible_user=ubuntu http_port=80 nginx_worker=4
web-02 ansible_user=ubuntu http_port=8080 nginx_worker=2
[webservers:vars]
nginx_version=1.24
deploy_path=/opt/app
# hosts.yml — variabel inline di format YAML
all:
children:
webservers:
hosts:
web-01:
ansible_user: ubuntu
http_port: 80
vars:
nginx_version: "1.24"
Ini cukup untuk inventory kecil, tapi akan cepat menjadi berantakan saat variabel bertambah banyak.
2. Direktori group_vars/ #
File di dalam group_vars/ otomatis dibaca sebagai variabel untuk grup yang namanya sesuai. Ini adalah cara yang direkomendasikan untuk variabel grup:
inventory/
├── hosts.ini
└── group_vars/
├── all.yml # Berlaku untuk semua host
├── webservers.yml # Hanya berlaku untuk grup webservers
└── dbservers.yml # Hanya berlaku untuk grup dbservers
# group_vars/all.yml — variabel yang berlaku untuk semua host
ansible_user: ubuntu
ansible_python_interpreter: /usr/bin/python3
timezone: "Asia/Jakarta"
ntp_servers:
- 0.id.pool.ntp.org
- 1.id.pool.ntp.org
# group_vars/webservers.yml
nginx_version: "1.24"
nginx_worker_processes: 4
nginx_worker_connections: 1024
http_port: 80
https_port: 443
deploy_path: /opt/webapp
# group_vars/dbservers.yml
postgresql_version: "15"
db_port: 5432
db_max_connections: 200
db_data_dir: /var/lib/postgresql/15/main
3. Direktori host_vars/ #
Sama seperti group_vars/, tapi berlaku untuk host spesifik. Gunakan ini untuk override variabel yang hanya berlaku untuk satu server:
inventory/
├── hosts.ini
└── host_vars/
├── web-01.yml # Hanya untuk web-01
└── db-01.yml # Hanya untuk db-01
# host_vars/web-01.yml
# web-01 adalah server dengan lebih banyak CPU
nginx_worker_processes: 8
# Override port karena ada legacy app di port 80
http_port: 8080
Struktur Direktori untuk Variabel Kompleks #
Saat variabel dalam satu file mulai terlalu panjang, kamu bisa menggunakan direktori sebagai pengganti file:
group_vars/
├── all.yml # Atau gunakan direktori:
└── webservers/ # Direktori untuk grup webservers
├── main.yml # Variabel umum
├── nginx.yml # Variabel khusus nginx
└── ssl.yml # Variabel khusus SSL
Ansible akan membaca semua file di dalam direktori tersebut dan menggabungkannya. Ini berguna untuk memisahkan variabel berdasarkan concern tanpa harus membuat terlalu banyak file di level yang sama.
Variabel Koneksi (Connection Variables) #
Beberapa variabel punya makna khusus bagi Ansible — variabel ini mengontrol bagaimana Ansible terhubung ke host, bukan konten konfigurasi yang akan diterapkan:
# group_vars/all.yml — variabel koneksi yang umum
ansible_user: ubuntu # User SSH
ansible_ssh_private_key_file: ~/.ssh/id_ed25519 # Private key
ansible_python_interpreter: /usr/bin/python3 # Path Python di managed node
ansible_port: 22 # Port SSH (jika bukan 22)
ansible_become: true # Aktifkan privilege escalation
ansible_become_method: sudo # Method escalation
# Override koneksi per-host di file inventory
[webservers]
web-01 ansible_port=2222 ansible_user=deployer
web-02 ansible_user=ubuntu
Hindari menyimpanansible_ssh_pass(password SSH) atauansible_become_pass(password sudo) langsung di file variabel dalam plaintext. Gunakan Ansible Vault untuk mengenkripsi nilai sensitif ini. Topik ini dibahas di section Security.
Urutan Precedence Variabel #
Saat variabel yang sama didefinisikan di beberapa tempat, Ansible menggunakan aturan precedence untuk menentukan nilai mana yang digunakan. Berikut urutan dari prioritas terendah ke tertinggi (nilai yang lebih tinggi menimpa yang lebih rendah):
Prioritas variabel inventory (terendah ke tertinggi):
1. group_vars/all ← paling mudah ditimpa
2. group_vars/<parent-group> ← grup induk
3. group_vars/<child-group> ← grup anak (lebih spesifik)
4. host_vars/<hostname> ← paling spesifik, prioritas tertinggi
Contoh nyata precedence:
# group_vars/all.yml
http_port: 80
# group_vars/webservers.yml
http_port: 8080 # Ini menimpa nilai di all.yml untuk grup webservers
# host_vars/web-01.yml
http_port: 9090 # Ini menimpa semua — hanya berlaku untuk web-01
Hasil akhir:
web-01 → http_port = 9090 (dari host_vars)
web-02 → http_port = 8080 (dari group_vars/webservers)
db-01 → http_port = 80 (dari group_vars/all)
Variabel per Lingkungan #
Pola yang sangat umum digunakan adalah mendefinisikan variabel berbeda untuk setiap lingkungan (staging, production) menggunakan inventory yang terpisah:
environments/
├── staging/
│ ├── hosts.ini
│ └── group_vars/
│ ├── all.yml # Variabel staging
│ └── webservers.yml
└── production/
├── hosts.ini
└── group_vars/
├── all.yml # Variabel production
└── webservers.yml
# environments/staging/group_vars/all.yml
env: staging
db_host: staging-db.internal
app_debug: true
log_level: debug
# environments/production/group_vars/all.yml
env: production
db_host: prod-db.internal
app_debug: false
log_level: warning
Playbook yang sama bisa dijalankan di staging dan production dengan perilaku yang berbeda, hanya dengan mengganti inventory yang digunakan:
ansible-playbook -i environments/staging/ deploy.yml
ansible-playbook -i environments/production/ deploy.yml
Anti-Pattern yang Harus Dihindari #
# ANTI-PATTERN: menyimpan semua variabel di satu file besar
# group_vars/all.yml dengan 200+ variabel
nginx_version: "1.24"
postgresql_version: "15"
redis_version: "7"
app_port: 8080
db_port: 5432
# ... 195 variabel lagi
# BENAR: pisahkan berdasarkan concern
# group_vars/webservers/nginx.yml → variabel nginx
# group_vars/dbservers/postgresql.yml → variabel postgresql
# group_vars/all/common.yml → variabel yang benar-benar global
# ANTI-PATTERN: variabel sensitif dalam plaintext di inventory
[dbservers:vars]
db_password=mysecretpassword123 # ← JANGAN! Ini akan masuk ke Git
# BENAR: gunakan Ansible Vault untuk nilai sensitif
# db_password disimpan terenkripsi di vault.yml
Ringkasan #
- Tiga cara mendefinisikan variabel inventory: inline di file inventory,
group_vars/, danhost_vars/— gunakangroup_vars/danhost_vars/untuk keterbacaan yang lebih baik.group_vars/all.ymlberisi variabel yang berlaku untuk semua host — simpan di sini hanya yang benar-benar global.host_vars/<hostname>.ymluntuk override variabel yang hanya berlaku untuk satu server spesifik.- Urutan precedence:
host_vars>group_vars/<child>>group_vars/<parent>>group_vars/all.- Variabel koneksi seperti
ansible_userdanansible_portmengontrol cara Ansible terhubung, bukan konten konfigurasi.- Jangan simpan password dalam plaintext di file inventory — gunakan Ansible Vault.
- Pisahkan inventory dan
group_vars/per lingkungan (staging/production) untuk mengelola konfigurasi yang berbeda dengan playbook yang sama.