Files
ansible_pr-sentation/handout.md
T
2026-09-14 11:36:01 +02:00

6.1 KiB

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!):

user:
  name: admin
  shell: /bin/bash
  groups:
    - sudo
    - docker

2. Ad-hoc-Befehle (ohne Playbook)

ansible <hosts> -m <modul> -a "<argumente>"

Beispiele:

# 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:

# Wert einsetzen
message: "Hallo {{ benutzer }}"
path: "/home/{{ benutzer }}/.config"

# Verschachtelte Variablen
db_host: "{{ hostvars['db'].ansible_host }}"

Filter

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:

# 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:

- name: OS anzeigen
  ansible.builtin.debug:
    msg: "{{ ansible_distribution }} {{ ansible_distribution_version }}"

Eigene Facts (Custom Facts) setzen:

# Datei anlegen (INI-Format):
#   /etc/ansible/facts.d/app.fact
# Inhalt:
#   [app]
#   version=1.2.3
# Abruf: {{ ansible_local.app.version }}

Facts deaktivieren (Performance):

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/<rolle>/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.

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):

- 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:

nginx_port: 80
domain: example.com

Rollen-Tasks (roles/webserver/tasks/main.yml):

- 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