π― Objective
- Use common modules (
apt,template,service) - Understand variables
- See variable precedence in action
- Use Jinja2 template
- Trigger handler on config change
- Observe idempotency
π Architecture
Flow:
Mac (Control Node)
β SSH
β 2 Ubuntu EC2 Instances
β Install & Configure Nginx
πΉ Step 1 β Launch 2 EC2 Instances
AMI: Ubuntu 22.04
Instance type: t2.micro
Security Group:
- Port 22 (SSH)
- Port 80 (HTTP)
πΉ Step 2 β Install Ansible (Control Node)
brew install ansible
Verify:
ansible --version
πΉ Step 3 β Create Inventory
inventory.ini
[web]
node1 ansible_host=3.x.x.x
node2 ansible_host=18.x.x.x
[web:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/Downloads/key.pem
Test:
ansible web -i inventory.ini -m ping
πΉ Step 4 β Create Project Structure
ansible-nginx-lab/
β
βββ inventory.ini
βββ deploy.yml
βββ group_vars/
β βββ web.yml
βββ templates/
βββ nginx.conf.j2
πΉ Step 5 β Variables (Group Level)
group_vars/web.yml
app_port: 80
server_name: jumptotech.local
welcome_message: "Welcome to JumpToTech DevOps Lab"
πΉ Step 6 β Create Template (Jinja2)
templates/nginx.conf.j2
```server {
listen {{ app_port }};
server_name {{ server_name }};
location / {
default_type text/plain;
return 200 "{{ welcome_message }}\n";
}
}
Students now see:
π Variables being injected dynamically.
---
# πΉ Step 7 β Create Playbook
`deploy.yml`
```yaml
- name: Deploy Nginx with Template
hosts: web
become: yes
vars:
server_name: override.local # Playbook variable (higher precedence)
tasks:
- name: Install nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Deploy nginx config from template
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: Restart nginx
- name: Ensure nginx is running
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
πΉ Step 8 β Run Playbook
ansible-playbook -i inventory.ini deploy.yml
Open browser:
http://<EC2-IP>
You should see:
Welcome to JumpToTech DevOps Lab
π₯ What Students Just Learned
β Modules
- apt
- template
- service
β Variables
- group_vars
- playbook vars
β Variable Precedence
We defined:
In group_vars:
server_name: jumptotech.local
In playbook:
vars:
server_name: override.local
Result?
Playbook variable wins.
To prove precedence:
Run with extra variable:
ansible-playbook -i inventory.ini deploy.yml -e "server_name=prod.local"
Extra vars override everything.
Precedence (simplified):
lowest β highest
- role defaults
- group_vars
- play vars
- extra vars (-e)
β Template
Jinja2 variable rendering
β Handler
Handler only runs if template changes.
Test it:
Run playbook again without changes:
Youβll see:
ok=3 changed=0
Handler will NOT run.
Now change welcome_message in group_vars and rerun.
Handler triggers.

Top comments (0)