Why variables?
Hardcoded:
name: nginxDynamic:
name: "{{ package_name }}"Same playbook, different packages or environments.
Variables → Playbook → Dynamic execution
{{ }} is Jinja2 syntax for reading a variable.
Types of variables
- Playbook variables (
vars:) - Inventory / host / group variables
- Extra variables (
-e) - Facts (auto-gathered)
Playbook variables
---
- name: Variables example
hosts: all
become: true
vars:
package_name: nginx
tasks:
- name: Install package
apt:
name: "{{ package_name }}"
state: presentvim playbooks/variables.yml
ansible-playbook playbooks/variables.ymlInventory variables in a playbook
# inventory.ini
[web]
web1 ansible_host=10.0.1.10 app_port=8080
[web:vars]
env=prod- debug:
msg: "App on {{ inventory_hostname }} port {{ app_port }} ({{ env }})"Extra variables
Highest priority for quick overrides / CI:
ansible-playbook playbooks/extra-vars.yml -e "package=git"vars:
package: nginx # default; -e overridesWhat are facts?
Facts are system information Ansible gathers automatically: hostname, OS, IP, CPU, RAM, and more.
Ansible connects → collects facts → available as variables
ansible all -m setup
ansible all -m setup -a "filter=ansible_distribution"| Fact | Meaning |
|---|---|
ansible_hostname | Hostname |
ansible_distribution | OS family/name |
ansible_processor_vcpus | vCPU count |
ansible_memtotal_mb | RAM (MB) |
ansible_default_ipv4.address | Primary IPv4 |
- name: Show host info
debug:
msg: "{{ ansible_hostname }} / {{ ansible_default_ipv4.address }}"OS-based install
- name: Install nginx on Ubuntu
apt:
name: nginx
state: present
when: ansible_distribution == "Ubuntu"Simple precedence
Extra vars (-e)
↓
Playbook vars
↓
Inventory / host / group vars
↓
Facts / defaults
Mini project — dynamic homepage
---
- name: Dynamic site
hosts: all
become: true
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
enabled: true
- name: Create dynamic webpage
copy:
dest: /var/www/html/index.html
content: |
<h1>Welcome to DevOps</h1>
<h2>Hostname: {{ ansible_hostname }}</h2>
<h2>IP: {{ ansible_default_ipv4.address }}</h2>Each server shows its own hostname and IP.
Variables = values you define. Facts = values Ansible discovers from the host.