Lab 01 · Interactive lab
One variable, one winner.
Ansible resolves a variable from up to 22 precedence levels. These are the 9 that actually trip people up. Toggle one to see which value wins, and why.
Precedence is a fixed order: the highest enabled source wins. Extra vars (-e) always win.
- 01Role defaults
The role's safe fallback
roles/web/defaults/main.yml:3
app_port: 8080on - 02Inventory · group_vars/all
A baseline for every inventory host
inventory/group_vars/all.yml:7
app_port: 80on - 03Inventory · group_vars/webservers
A more specific inventory group
inventory/group_vars/webservers.yml:4
app_port: 8443on - 04Inventory · host_vars/web01
An override for one managed host
inventory/host_vars/web01.yml:6
app_port: 9000on - 05Play vars
Declared for this play
playbooks/deploy.yml:8
app_port: 3000on - 06Role vars
The role's opinionated value
roles/web/vars/main.yml:2
app_port: 443on - 07Task vars
Scoped to the current task
playbooks/deploy.yml:21
app_port: 5000on - 08set_fact / registered
Computed at runtime
playbooks/deploy.yml:15
app_port: 6000on - 09Extra varswinner
-e @vars/override.yml
vars/override.yml:1
app_port: 1234on
Extra vars (-e) have the highest variable precedence, so nothing below can override them.
Use these commands against your own inventory and playbooks when a variable surprises you.
See the variables your inventory assigns to web01.
ansible-inventory --host web01Print app_port as Ansible resolves it for web01.
ansible web01 -m debug -a "var=app_port"Increase verbosity while the playbook runs.
ansible-playbook site.yml -vvvOverride every lower-precedence definition for this run.
ansible-playbook site.yml -e app_port=1234