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.

Current winnerExtra vars · 9/9
Precedence stacklowest → highest

Precedence is a fixed order: the highest enabled source wins. Extra vars (-e) always win.

Try thisguided setups
ChallengeTest your understanding
Role behaviordefaults + vars exposed to play
Role invocation
Role condition
LowestStronger ↓
  1. Role defaults

    The role's safe fallback

    roles/web/defaults/main.yml:3

    app_port: 8080
    on
  2. Inventory · group_vars/all

    A baseline for every inventory host

    inventory/group_vars/all.yml:7

    app_port: 80
    on
  3. Inventory · group_vars/webservers

    A more specific inventory group

    inventory/group_vars/webservers.yml:4

    app_port: 8443
    on
  4. Inventory · host_vars/web01

    An override for one managed host

    inventory/host_vars/web01.yml:6

    app_port: 9000
    on
  5. Play vars

    Declared for this play

    playbooks/deploy.yml:8

    app_port: 3000
    on
  6. Role vars

    The role's opinionated value

    roles/web/vars/main.yml:2

    app_port: 443
    on
  7. Task vars

    Scoped to the current task

    playbooks/deploy.yml:21

    app_port: 5000
    on
  8. set_fact / registered

    Computed at runtime

    playbooks/deploy.yml:15

    app_port: 6000
    on
  9. Extra varswinner

    -e @vars/override.yml

    vars/override.yml:1

    app_port: 1234
    on
Highest
What winslive resolution
Precedence positionExtra vars · 9/9
lowesthighest
Share this setupCopy this exact configuration.
app_portlive
app_port=1234
Why this wins

Extra vars (-e) have the highest variable precedence, so nothing below can override them.

Originvars/override.yml:1
ansible-playbook -vvv
TASK [debug var=app_port]
ok: [web01] => {
"app_port": 1234
}
# resolved from extra_vars (overrode 8 lower definitions)
Take it to your terminalreal commands

Use these commands against your own inventory and playbooks when a variable surprises you.

variable checks

See the variables your inventory assigns to web01.

ansible-inventory --host web01

Print 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 -vvv

Override every lower-precedence definition for this run.

ansible-playbook site.yml -e app_port=1234