Lab 08: Ansible Variables, Templates & Handlers
Overview
Prerequisites
Step 1: Variable Precedence — 16 Levels
docker run --rm ubuntu:22.04 bash -c "
apt-get update -qq 2>/dev/null && apt-get install -y -qq python3-pip python3 2>/dev/null
pip3 install ansible --quiet 2>/dev/null
cat > /tmp/hosts.ini << 'EOF'
[webservers]
localhost ansible_connection=local http_port=9090
[webservers:vars]
http_port=8080
app_name=myapp
EOF
mkdir -p /tmp/group_vars /tmp/host_vars
cat > /tmp/group_vars/webservers.yml << 'EOF'
---
http_port: 7070
max_connections: 500
EOF
cat > /tmp/host_vars/localhost.yml << 'EOF'
---
http_port: 6060
server_role: primary
EOF
cat > /tmp/precedence_test.yml << 'EOF'
---
- name: Variable precedence demonstration
hosts: webservers
gather_facts: false
vars:
http_port: 5050
play_var: from_play
tasks:
- name: Show http_port (play vars override group/host vars)
debug:
msg: \"http_port = {{ http_port }} (play vars win over group_vars/host_vars)\"
- name: Extra vars override everything
debug:
msg: \"extra_var = {{ extra_var | default('not set - use -e to set') }}\"
- name: Show all variable sources
debug:
msg: |
Variable Precedence (lowest to highest):
1. role defaults (defaults/main.yml)
2. inventory file or script group vars
3. inventory group_vars/all
4. playbook group_vars/all
5. inventory group_vars/*
6. playbook group_vars/*
7. inventory file or script host vars
8. inventory host_vars/*
9. playbook host_vars/*
10. host facts / cached set_facts
11. play vars
12. play vars_prompt
13. play vars_files
14. role vars (vars/main.yml)
15. block vars (only for tasks in block)
16. task vars (only for the task)
17. include_vars
18. set_facts / registered vars
19. role (and include_role) params
20. include params
21. extra vars (-e) ALWAYS WIN
EOF
ansible-playbook -i /tmp/hosts.ini /tmp/precedence_test.yml 2>&1
echo ''
echo '--- With extra vars (-e overrides everything) ---'
ansible-playbook -i /tmp/hosts.ini /tmp/precedence_test.yml -e 'extra_var=from_command_line http_port=1111' 2>&1 | grep 'http_port\|extra_var'
"Step 2: vars, vars_files, and register
Step 3: Jinja2 Templates — .j2 Files
Step 4: Handlers — notify and listen
Step 5: when Conditions and Loops
Step 6: include_tasks and import_tasks
Step 7: Advanced Jinja2 Filters and Tests
Step 8: Capstone — Dynamic Configuration Generator
Summary
Concept
Syntax
Purpose
Last updated
