Scope & Precedence #
Salah satu aspek Ansible yang paling membingungkan pemula — dan bahkan developer berpengalaman — adalah variabel yang nilainya tidak sesuai ekspektasi. Kamu mendefinisikan variabel di satu tempat, tapi saat playbook berjalan nilainya berbeda. Penyebabnya hampir selalu satu hal: ada variabel lain di lokasi yang lebih tinggi prioritasnya yang menimpa nilaimu. Memahami scope dan precedence variabel adalah kunci untuk menghilangkan kebingungan ini selamanya.
Tiga Scope Variabel #
Sebelum membahas precedence, pahami dulu bahwa variabel Ansible memiliki tiga lingkup (scope):
Global scope — tersedia di semua host dan semua play
— contoh: variabel yang dipass via -e di command line
Play scope — tersedia untuk semua host dalam satu play
— contoh: vars: yang didefinisikan di dalam play
Host scope — tersedia untuk satu host tertentu saja
— contoh: host_vars/, fakta host, variabel yang di-register
Variabel yang di-register menggunakan register hanya tersedia untuk host yang mengeksekusi task tersebut. Variabel di group_vars/ tersedia untuk semua host dalam grup tersebut. Variabel yang dipass via -e tersedia di mana saja.
22 Level Precedence #
Ansible mendefinisikan 22 level prioritas variabel — dari yang paling mudah ditimpa hingga yang paling kuat. Berikut urutan dari prioritas terendah ke tertinggi:
Prioritas terendah (paling mudah ditimpa):
1. command line values (misalnya -u REMOTE_USER)
2. role defaults (role/defaults/main.yml)
3. inventory file atau script group vars
4. inventory group_vars/all
5. playbook group_vars/all
6. inventory group_vars/*
7. playbook group_vars/*
8. inventory file atau script host vars
9. inventory host_vars/*
10. playbook host_vars/*
11. host facts / cached set_facts
12. play vars
13. play vars_prompt
14. play vars_files
15. role vars (role/vars/main.yml)
16. block vars (hanya dalam block)
17. task vars (hanya dalam task itu)
18. include_vars
19. set_facts / registered vars
20. role (dan include_role) params
21. include params
22. extra vars (-e di command line) ← prioritas TERTINGGI
Kamu tidak perlu hafal semua 22 level ini. Yang paling penting dipahami adalah empat level yang paling sering digunakan dalam praktik sehari-hari.
Empat Level yang Paling Sering Digunakan #
Role Defaults — Nilai Paling Mudah Ditimpa #
# roles/nginx/defaults/main.yml
# Nilai default yang mudah ditimpa dari mana saja
nginx_port: 80
nginx_worker_processes: 4
nginx_client_max_body_size: "10m"
defaults/main.yml adalah tempat untuk nilai-nilai yang boleh dengan mudah di-override. Gunakan ini untuk semua variabel yang ingin kamu beri nilai default tapi memungkinkan pengguna role untuk menggantinya.
Inventory Variables — Nilai per Lingkungan #
# inventory/production/group_vars/webservers.yml
nginx_port: 443
nginx_worker_processes: 8
Variabel inventory berada di level menengah — menimpa role defaults, tapi bisa ditimpa oleh variabel play, task, atau extra vars.
Role Vars — Nilai yang Sulit Ditimpa #
# roles/nginx/vars/main.yml
# Nilai internal role yang TIDAK dimaksudkan untuk di-override
nginx_config_dir: /etc/nginx
nginx_pid_file: /var/run/nginx.pid
vars/main.yml dalam role berada di level yang jauh lebih tinggi dari defaults/main.yml. Gunakan ini untuk konstanta internal role yang tidak boleh diubah dari luar. Ini adalah perbedaan paling krusial yang sering membingungkan.
defaults/main.yml → "Saya menyarankan nilai ini, silakan ganti jika perlu"
vars/main.yml → "Saya menetapkan nilai ini, jangan ganti sembarangan"
Extra Vars — Selalu Menang #
# Extra vars selalu menimpa semua variabel lain
ansible-playbook site.yml -e "nginx_port=8080"
ansible-playbook site.yml -e "@override-vars.yml" # dari file
Extra vars berguna untuk override sementara saat debugging atau deployment darurat. Tapi jangan gunakan untuk konfigurasi permanen — simpan di inventory atau role.
Contoh Precedence dalam Praktik #
Bayangkan skenario berikut dengan variabel app_port didefinisikan di beberapa tempat:
# roles/myapp/defaults/main.yml
app_port: 8080 # Level 2 — terendah
# inventory/production/group_vars/appservers.yml
app_port: 9090 # Level 7 — menimpa role defaults
# playbook.yml (vars: di dalam play)
vars:
app_port: 3000 # Level 12 — menimpa inventory vars
# Jalankan dengan extra vars
ansible-playbook site.yml -e "app_port=5000"
# Extra vars (level 22) menimpa semuanya — app_port = 5000
Nilai akhir yang digunakan Ansible dalam setiap skenario:
- Tanpa override apapun →
8080(dari role defaults) - Dengan inventory production →
9090 - Dengan play vars →
3000 - Dengan
-e "app_port=5000"→5000(selalu menang)
Debug Precedence #
Saat nilai variabel tidak sesuai ekspektasi, gunakan pendekatan sistematis:
# Tambahkan task debug untuk melihat nilai dan sumbernya
- name: Debug nilai variabel
debug:
var: app_port
# Atau gunakan vars_debug untuk melihat semua variabel sekaligus
- name: Debug semua variabel host
debug:
var: hostvars[inventory_hostname]
# Dari command line — tampilkan semua variabel untuk host tertentu
ansible -i inventory/ web-01 -m debug -a "var=hostvars['web-01']"
# Gunakan verbosity untuk melihat dari mana variabel berasal
ansible-playbook site.yml -vvv | grep "app_port"
Pola yang Direkomendasikan #
Gunakan ini untuk nilai default role → defaults/main.yml
Gunakan ini untuk konstanta internal → vars/main.yml
Gunakan ini untuk konfigurasi per-env → inventory group_vars/
Gunakan ini untuk konfigurasi per-host → inventory host_vars/
Gunakan ini untuk override sementara → -e di command line
JANGAN gunakan ini untuk konfigurasi permanen → -e di command line
Ringkasan #
- Variabel Ansible punya tiga scope: global, play, dan host — scope menentukan di mana variabel tersedia.
- Ada 22 level precedence — dari role defaults (terendah) hingga extra vars
-e(tertinggi).defaults/main.ymluntuk nilai default yang boleh di-override;vars/main.ymluntuk konstanta internal yang tidak boleh diubah sembarangan.- Extra vars (
-e) selalu menang — berguna untuk debugging dan override sementara, tapi jangan gunakan untuk konfigurasi permanen.- Saat nilai variabel tidak sesuai ekspektasi, gunakan
debug: var=atauansible -m debuguntuk menelusuri nilainya.- Aturan praktis: semakin spesifik sumber variabel (host > grup > all), semakin tinggi prioritasnya.