Ansible-Beispiel: Rolle, Variablen & Templating (localhost)
Ein vollständiges Beispiel-Projekt, das alle Konzepte aus der Präsentation demonstriert:
- Rollen-Struktur (
roles/webserver/) - Variablen-Vergabe mit Präzedenz (defaults → vars → group_vars → host_vars)
- Templating mit Jinja2 (
.j2-Dateien, Schleifen, Filter) - FQCN (
ansible.builtin.*) - Facts (
ansible_facts['distribution'],ansible_facts['hostname'], …) - Handler (
notify→ Dienst neu starten)
Verzeichnisstruktur
Beispiel/
├── ansible.cfg # Ansible-Konfiguration
├── inventory.yml # Ziel-Hosts (localhost)
├── site.yml # Haupt-Playbook
├── group_vars/
│ └── all.yml # Variablen für ALLE Hosts
├── host_vars/
│ └── localhost.yml # Host-spezifische Variablen
└── roles/
└── webserver/
├── tasks/main.yml # Aufgaben
├── handlers/main.yml # Neustart-Aktionen (notify)
├── templates/
│ ├── nginx.conf.j2 # Jinja2-Template
│ └── index.html.j2 # Template mit Schleife + Filter
├── defaults/main.yml # Standard-Variablen (niedrigste Priorität)
├── vars/main.yml # Rollen-Variablen (höhere Priorität)
└── meta/main.yml # Rollen-Metadaten
Ausführen
# Trockenlauf — zeigt nur, was passieren würde
ansible-playbook site.yml --check
# Echt ausführen (benötigt sudo wegen Paket-Installation)
ansible-playbook site.yml
# Variable per CLI überschreiben (HÖCHSTE Priorität!)
ansible-playbook site.yml -e "nginx_port=9090"
Wichtig: Das Playbook läuft über
connection: localdirekt auf diesem Rechner — „localhost" ist kein echter Host im Netzwerk, es gibt nichts, wohin per SSH verbunden werden müsste. (Zusätzlich istansible_connection: localauch iminventory.ymlhinterlegt.)
Variablen-Präzedenz im Beispiel
Dieselbe Variable (nginx_port) ist an mehreren Stellen definiert — wer gewinnt?
| Priorität | Ort | Wert |
|---|---|---|
| 1 (höchste) | Extra-Variablen -e |
9090 (wenn gesetzt) |
| 2 | host_vars/localhost.yml |
8080 |
| 3 | group_vars/all.yml |
— |
| 4 | roles/.../vars/main.yml |
nginx_user |
| 5 (niedrigste) | roles/.../defaults/main.yml |
80 (Default) |
→ Ergebnis: nginx_port wird 8080, weil host_vars Vorrang vor defaults
hat (die Default 80 wird überschrieben).
Für Manjaro / Arch Linux anpassen
Das Beispiel nutzt apt (Debian/Ubuntu). Auf Manjaro ersetzt Du in
roles/webserver/tasks/main.yml das Modul:
- name: Pakete installieren
community.general.pacman:
name: "{{ packages }}"
state: present
update_cache: true
und passt die Paketnamen (nginx, git, curl bleiben gleich) sowie
nginx_user ggf. an.