Skip to content

Variable Precedence Cheat Sheet

Highest at the top. This is the full documented order.

Rank Source File / Location
1 (highest) Extra vars -e key=value / -e @file.yml
2 Include params vars: on include_tasks / include_role
3 Role params vars: on a role under roles: or import_role
4 set_fact / registered vars Set at run time
5 include_vars Loaded at run time
6 Task vars vars: on a task
7 Block vars vars: on a block
8 Role vars roles/<role>/vars/main.yml
9 Play vars_files Files listed on the play
10 Play vars_prompt Prompted at start
11 Play vars vars: on a play
12 Facts / cached set_fact Gathered from the host
13 Playbook host_vars/* Next to the playbook
14 Inventory host_vars/* Next to the inventory
15 Inventory file host vars Inline on the host line
16 Playbook group_vars/* Next to the playbook
17 Inventory group_vars/* Next to the inventory
18 Playbook group_vars/all Next to the playbook
19 Inventory group_vars/all Next to the inventory
20 Inventory file group vars [group:vars]
21 Role defaults roles/<role>/defaults/main.yml
22 (lowest) Command-line options (not variables) -u, --private-key

Four rules: -e always wins · run-time values (set_fact, register, include_vars) beat file-based vars except role/include params · host beats group beats all · role vars/ beats inventory, role defaults/ loses to everything.

Verify, don't guess: ansible-inventory --host <name> for inventory-side values; a debug: var=<name> task for what a task actually sees.

Full explanation: Variable Precedence