# Ansible — Syntax & Variablen-Handout Kompakte Referenz zu YAML-Syntax, Ad-hoc-Befehlen, Jinja2, Facts, Variablen-Auflösung und FQCN. --- ## 1. YAML-Grundsyntax | Element | Syntax | Beispiel | |--------------------|-----------------|--------------------------| | Schlüssel-Wert | `key: wert` | `name: webserver` | | Liste | `- eintrag` | `- nginx` | | Verschachtelung | Einrückung | 2 Leerzeichen (KEINE Tabs) | | Kommentar | `# text` | `# Dies ist ein Kommentar` | | Zeichenkette | mit/ohne Quotes | `name: "Mein Server"` | Einrückung mit 2 Leerzeichen (niemals Tabs!): ```yaml user: name: admin shell: /bin/bash groups: - sudo - docker ``` --- ## 2. Ad-hoc-Befehle (ohne Playbook) ```bash ansible -m -a "" ``` Beispiele: ```bash # Erreichbarkeit testen ansible all -m ping # Facts anzeigen ansible webserver -m setup # Paket installieren ansible webserver -m apt -a "name=nginx state=present" # Dienst neu starten ansible webserver -m service -a "name=nginx state=restarted" ``` Wichtige Optionen: | Option | Bedeutung | |--------|----------------------| | `-m` | Modul wählen | | `-a` | Argumente übergeben | | `-i` | Inventory angeben | | `-b` | become (sudo) | | `-u` | Benutzer | --- ## 3. Jinja2 — Variablen auflösen Ansible nutzt die Template-Engine **Jinja2**. Variablen werden in doppelte geschweifte Klammern gesetzt: ```yaml # Wert einsetzen message: "Hallo {{ benutzer }}" path: "/home/{{ benutzer }}/.config" # Verschachtelte Variablen db_host: "{{ hostvars['db'].ansible_host }}" ``` ### Filter ```yaml name: "{{ name | upper }}" # -> GROSSSCHREIBUNG port: "{{ port | default(80) }}" # Fallback, wenn Variable leer anzahl: "{{ liste | length }}" # Anzahl der Elemente ip: "{{ ansible_host | ipaddr }}" # IP-Adresse validieren ``` ### Template-Dateien (.j2) Dateien mit Endung `.j2` werden vom Modul `template` gerendert: ```jinja # nginx.conf.j2 server { listen {{ nginx_port }}; server_name {{ domain }}; root {{ web_root }}; } ``` --- ## 4. Gather Facts (Systeminformationen) Ansible sammelt automatisch **Facts** (Systeminformationen) über jeden Host — über das Modul `setup`, standardmäßig `gather_facts: true`. Häufige Facts: | Fact | Bedeutung | |---------------------------------|-------------------------------| | `ansible_os_family` | OS-Familie (Debian, RedHat) | | `ansible_distribution` | z.B. Ubuntu, CentOS, Debian | | `ansible_distribution_version` | Version (z.B. 22.04) | | `ansible_hostname` | Hostname des Systems | | `ansible_default_ipv4.address` | IP-Adresse | | `ansible_architecture` | CPU-Architektur (x86_64) | | `ansible_memtotal_mb` | RAM in MB | | `ansible_processor_vcpus` | Anzahl CPU-Kerne | Zugriff im Playbook: ```yaml - name: OS anzeigen ansible.builtin.debug: msg: "{{ ansible_distribution }} {{ ansible_distribution_version }}" ``` Eigene Facts (Custom Facts) setzen: ```bash # Datei anlegen (INI-Format): # /etc/ansible/facts.d/app.fact # Inhalt: # [app] # version=1.2.3 # Abruf: {{ ansible_local.app.version }} ``` Facts deaktivieren (Performance): ```yaml gather_facts: false ``` --- ## 5. Wo Variablen definiert werden | Quelle | Datei / Ort | Beispiel | |------------|------------------------------------|---------------------------------| | Inventory | `host_vars/`, `group_vars/` | `group_vars/webserver.yml` | | Playbook | `vars:` / `vars_files:` | `vars: { port: 8080 }` | | Rolle | `roles//vars/` + `defaults/`| `vars/main.yml` | | Facts | automatisch gesammelt | `ansible_os_family` | | Laufzeit | `register` / `set_fact` | `register: result` | | CLI | Extra-Variablen | `-e "port=8080"` | --- ## 6. Variablen-Präzedenz (Auflösungs-Reihenfolge) Ist dieselbe Variable an mehreren Stellen definiert, gewinnt die mit der **höchsten** Priorität (oben = gewinnt): 1. **Extra-Variablen** (CLI `-e`) — gewinnen immer 2. **Task-/Block-Variablen** (`vars:` direkt an der Aufgabe) 3. **set_fact / register** (Werte aus der Laufzeit) 4. **Rollen-Variablen** (`roles/.../vars/main.yml`) 5. **Playbook-Variablen** (`vars:` im Play) 6. **host_vars / group_vars** (aus dem Inventory) 7. **Rollen-Defaults** (`roles/.../defaults/main.yml`) — verlieren > **Faustregel:** Je spezifischer die Quelle, desto höher die Priorität. --- ## 7. Module & FQCN FQCN = **Fully Qualified Collection Name** — `namespace.collection.modul`. ```yaml ansible.builtin.apt: name: nginx state: present ``` | FQCN | Zweck | |-----------------------------------|---------------------------| | `ansible.builtin.copy` | Datei kopieren | | `ansible.builtin.apt` | Paket installieren (Debian) | | `ansible.builtin.service` | Dienst verwalten | | `ansible.builtin.template` | `.j2`-Template rendern | | `ansible.posix.firewalld` | Firewall konfigurieren | | `community.general.git_config` | Git-Einstellungen | --- ## 8. Vollständiges Beispiel **Playbook** (`deploy.yml`): ```yaml - name: Webserver ausrollen hosts: webserver become: true vars: nginx_port: 8080 # überschreibt den Rollen-Default roles: - webserver ``` **Rollen-Defaults** (`roles/webserver/defaults/main.yml`) — niedrigste Priorität: ```yaml nginx_port: 80 domain: example.com ``` **Rollen-Tasks** (`roles/webserver/tasks/main.yml`): ```yaml - name: nginx installieren ansible.builtin.apt: name: nginx state: present - name: Konfiguration rendern ansible.builtin.template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf ```