# 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_distribution`, `ansible_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 ```bash # 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: local` direkt auf diesem > Rechner — „localhost" ist kein echter Host im Netzwerk, es gibt nichts, wohin > per SSH verbunden werden müsste. (Zusätzlich ist `ansible_connection: local` > auch im `inventory.yml` hinterlegt.) --- ## 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: ```yaml - 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.