Scope & Precedence

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.yml untuk nilai default yang boleh di-override; vars/main.yml untuk 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= atau ansible -m debug untuk menelusuri nilainya.
  • Aturan praktis: semakin spesifik sumber variabel (host > grup > all), semakin tinggi prioritasnya.

← Sebelumnya: Condition & Loop   Berikutnya: Facts →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact