Ansible Playbook YAML

6 Kernkonzepte
Die wichtigsten YAML-Konzepte für Ansible Playbooks: Play · Tasks · Modules · Handlers · Variables · Conditionals & Loops Ansible Playbooks sind das Herzstück der Ansible-Automatisierung. Sie werden in YAML geschrieben und definieren die gewünschten Zustände von Systemen. Diese Konzepte sind essenziell für die Erstellung von effektiven Automatisierungs-Workflows.

Play – Die oberste Ebene eines Playbooks

- name · hosts · tasks · become
- name: "Webserver einrichten" hosts: webservers become: yes tasks: - name: "Nginx installieren" apt: name: nginx state: present

Play ist die oberste Einheit eines Playbooks. Ein Playbook kann mehrere Plays enthalten, die auf verschiedenen Host-Gruppen ausgeführt werden. Jedes Play definiert, welche Hosts angesprochen werden und welche Tasks ausgeführt werden.

Wichtige Play-Attribute

Attribut Beschreibung
name Beschreibender Name des Plays
hosts Hosts oder Host-Gruppen (inventory)
become Privilegien-Eskalation (sudo)
tasks Liste der auszuführenden Tasks
vars Variablen für dieses Play
handlers Handler für dieses Play
pre_tasks / post_tasks Aufgaben vor/nach Haupt-Tasks
Beispiele
# Einfaches Play für Webserver
- name: "Webserver konfigurieren"
hosts: webservers
become: yes
vars:
nginx_port: 8080
tasks:
- name: "Nginx installieren"
apt:
name: nginx
state: latest
- name: "Port in Konfiguration setzen"
lineinfile:
path: /etc/nginx/nginx.conf
regexp: '^listen'
line: "listen {{ nginx_port }};"
- name: "Nginx starten"
service:
name: nginx
state: started
enabled: yes
Tipp: Ein Playbook kann mehrere Plays enthalten – z.B. eins für Webserver und eins für Datenbanken. Jedes Play hat eigene hosts und tasks.

Tasks – Aufgaben in Plays

- name · module · register · tags
- name: "Benutzer erstellen" user: name: deploy state: present register: user_result tags: - user

Tasks sind die einzelnen Arbeitsschritte in einem Play. Jeder Task verwendet ein Modul, um eine bestimmte Aktion auf dem Zielsystem auszuführen. Tasks werden sequenziell abgearbeitet.

Wichtige Task-Attribute

Attribut Beschreibung
name Beschreibender Name des Tasks
<modul> Das zu verwendende Modul (z.B. apt, copy, service)
register Speichert das Ergebnis in einer Variable
tags Tags für selektive Ausführung
when Bedingung für die Ausführung
ignore_errors Fehler ignorieren
notify Handler auslösen
Beispiele
# Task mit register und debug
- name: "Hostname prüfen"
command: hostname
register: hostname_result
- name: "Hostname ausgeben"
debug:
msg: "Hostname: {{ hostname_result.stdout }}"
# Task mit Tags
- name: "Datei kopieren"
copy:
src: files/app.conf
dest: /etc/app.conf
tags:
- config
- files
# Task mit ignore_errors
- name: "Potentiell fehlschlagender Befehl"
command: /usr/bin/may-fail
ignore_errors: yes
Tipp: Verwenden Sie register und debug für Debugging-Zwecke. Tags (tags) helfen, nur bestimmte Tasks auszuführen: ansible-playbook playbook.yml --tags config.

Module – Die Werkzeuge von Ansible

apt · yum · copy · file · service · template
- name: "Apache installieren" apt: name: apache2 state: present

Module sind die ausführbaren Einheiten in Ansible. Sie abstrahieren Systemoperationen – von Paketverwaltung über Dateioperationen bis zu Cloud-APIs. Module sind idempotent: Sie führen nur dann eine Änderung durch, wenn der gewünschte Zustand noch nicht erreicht ist.

Häufige Module

Modul Beschreibung Beispiel
apt / yum / dnf Paketverwaltung name: nginx state: present
copy Dateien kopieren src: ./file dest: /tmp/file
file Dateien/Verzeichnisse verwalten path: /tmp/dir state: directory
service Dienste verwalten name: nginx state: started enabled: yes
template Jinja2-Templates rendern src: template.j2 dest: /etc/config
user Benutzer verwalten name: deploy state: present
command / shell Befehle ausführen cmd: "echo hello"
debug Nachrichten ausgeben msg: "{{ variable }}"
git Git-Repository klonen repo: https://... dest: /app
Beispiele
# apt Modul (Debian/Ubuntu)
- name: "Pakete installieren"
apt:
name: "{{ packages }}"
state: present
update_cache: yes
vars:
packages:
- nginx
- git
- curl
# copy Modul
- name: "Konfiguration kopieren"
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
# service Modul
- name: "Nginx starten"
service:
name: nginx
state: started
enabled: yes
Tipp: Nutzen Sie die Ansible Modul-Index für eine vollständige Übersicht. Die meisten Module sind idempotent – sie ändern nur bei Bedarf.

Handlers – Reaktionen auf Änderungen

handlers · notify · listen
# Task löst Handler aus - name: "Konfiguration ändern" copy: src: nginx.conf dest: /etc/nginx/nginx.conf notify: restart nginx # Handler-Definition handlers: - name: "restart nginx" service: name: nginx state: restarted

Handlers sind spezielle Tasks, die nur ausgeführt werden, wenn sie von einem anderen Task über notify ausgelöst werden. Sie werden einmalig am Ende eines Plays ausgeführt – ideal für das Neuladen von Diensten nach Konfigurationsänderungen.

Beispiele
# Handler für Service-Neustart
handlers:
- name: "Apache neustarten"
service:
name: apache2
state: restarted
# Handler mit listen (mehrere Handler)
- name: "reload apache"
service:
name: apache2
state: reloaded
listen: "apache config changed"
# Task löst Handler aus
- name: "Apache-Konfiguration aktualisieren"
template:
src: templates/httpd.conf.j2
dest: /etc/apache2/apache2.conf
notify: "apache config changed" # via listen
Tipp: Handler werden nur einmal pro Play ausgeführt – auch wenn sie von mehreren Tasks benachrichtigt werden. Verwenden Sie listen für flexible Handler-Auslösung.

Variablen – Dynamische Werte

vars · facts · group_vars · host_vars
# Play-Variablen vars: app_port: 3000 app_env: production # Facts (automatisch erfasst) ansible_facts: ansible_hostname: web01 ansible_distribution: Ubuntu

Variablen in Ansible ermöglichen dynamische Playbooks. Sie können auf verschiedenen Ebenen definiert werden – in Plays, Inventory, Host-Variablen oder externen Dateien. Facts sind automatisch erfasste Systeminformationen.

Variable-Levels

Level Beschreibung
Play vars Direkt im Play definiert
vars_files Externe YAML/JSON-Dateien
host_vars Host-spezifische Variablen (hosts/.yml)
group_vars Gruppen-spezifische Variablen (groups/.yml)
Inventory vars Direkt im Inventory definiert
Facts Automatisch erfasste Systeminformationen
Beispiele
# Play-Variablen
- name: "App deployen"
hosts: appservers
vars:
app_name: myapp
app_version: 1.2.3
# Externe vars_file
vars_files:
- vars/default.yml
- vars/{{ app_env }}.yml
# Facts in Tasks verwenden
- name: "Systeminformationen ausgeben"
debug:
msg: "Host: {{ ansible_hostname }}, OS: {{ ansible_distribution }}"
# Bedingung mit Variablen
- name: "Nur auf Ubuntu ausführen"
debug:
msg: "Ubuntu erkannt"
when: ansible_distribution == "Ubuntu"
Tipp: Nutzen Sie ansible facts für dynamische, host-spezifische Entscheidungen. Mit setup können Sie alle Facts anzeigen: ansible -m setup host.

Conditionals & Loops – Bedingungen und Schleifen

when · loop · with_items · with_dict
# Bedingung when: ansible_os_family == "Debian" # Schleife loop: - "package1" - "package2"

Conditionals (when) steuern, ob ein Task ausgeführt wird. Loops (loop, with_items) ermöglichen die Wiederholung eines Tasks mit verschiedenen Werten.

Häufige Loop-Varianten

Syntax Beschreibung
loop: ["wert1", "wert2"] Einfache Liste
loop: "{{ list_variable }}" Liste aus Variable
with_items Legacy-Alternative zu loop
with_dict Dictionary iterieren
with_fileglob Dateimuster
Beispiele
# Bedingung: nur auf Debian-basierten Systemen
- name: "Debian-spezifische Konfiguration"
copy:
src: files/debian.conf
dest: /etc/app.conf
when: ansible_os_family == "Debian"
# Loop über Pakete
- name: "Pakete installieren"
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- git
- curl
# with_dict über Benutzer
- name: "Benutzer erstellen"
user:
name: "{{ item.key }}"
group: "{{ item.value.group }}"
with_dict:
alice: { group: developers }
bob: { group: admins }
# Kombination: loop + when
- name: "Pakete nur auf Debian installieren"
apt:
name: "{{ item }}"
state: present
loop: "{{ packages }}"
when: ansible_os_family == "Debian"
Tipp: loop ist die moderne Syntax gegenüber with_items. Für komplexe Schleifen verwenden Sie with_dict oder with_fileglob. Kombinieren Sie loop mit when für selektive Wiederholungen.

Ansible Playbook Best Practices

Idempotenz Tasks sollen immer den gleichen Zustand herstellen
Nur bei Änderung ausführen
Handler Service-Neustart nur bei Konfigurationsänderung
notify und handlers
Tags Selektive Ausführung von Tasks
ansible-playbook --tags
Facts Systeminformationen nutzen
ansible_facts
Variablen Zentrale Verwaltung
group_vars, host_vars
Check Mode Trockenlauf testen
--check --diff

Quick Summary

Play
Oberste Ebene
Tasks
Einzelne Schritte
Module
Werkzeuge
Handler
Reaktionen
Variables
Dynamische Werte
when/loop
Bedingungen/Schleifen
ansible-playbook playbook.yml --check --diff · ansible-playbook playbook.yml --tags config