Here is the order of precedence from least to greatest (the last listed variables override all other variables):
- command line values (for example,
-u my_user
, these are not variables) - role defaults (defined in
role/defaults/main.yml
) [1] - inventory file or script
group vars
[2] - inventory
group_vars/all
[3] - playbook
group_vars/all
[3] - inventory
group_vars/*
[3] - playbook
group_vars/*
[3] - inventory file or script host vars [2]
- inventory
host_vars/*
[3] - playbook
host_vars/*
[3] - host
facts
/ cachedset_facts
[4] - play
vars
- play
vars_prompt
- play
vars_files
- role
vars
(defined inrole/vars/main.yml
) - block
vars
(only for tasks in block) - task
vars
(only for the task) include_vars
set_facts
/ registered vars- role (and
include_role
) params - include
params
- extra
vars
(for example,-e "user=my_user"
)(always win precedence)
In general, Ansible gives precedence to variables that were defined more recently, more actively,
and with more explicit scope. Variables in the defaults folder inside a role are easily overridden.
Anything in the vars directory of the role overrides previous versions of that variable in the namespace.
Host and/or inventory variables override role defaults, but explicit includes such as the vars directory
or an include_vars
task override inventory variables.
Ansible merges different variables set in inventory so that more specific settings override more generic settings.
For example, ansible_ssh_user
specified as a group_var is overridden by ansible_user
specified as a host_var
.
[1] Variables defined in inventory file or provided by dynamic inventory.
[2] Includes vars added by ‘vars plugins’ as well as
host_vars
andgroup_vars
which are added by the default vars plugin shipped with Ansible.[3] When created with
set_facts
’s cacheable option, variables have the high precedence in the play, but are the same as a host facts precedence when they come from the cache.[4] Within any section, redefining a var overrides the previous instance. If multiple groups have the same variable, the last one loaded wins. If you define a variable twice in a play’s
vars:
section, the second one wins.