YAML
YAML (YAML Ain't Markup Language) ist ein menschenlesbares Daten-Serialisierungsformat, das sich besonders für Konfigurationsdateien etabliert hat. Im Gegensatz zu XML und JSON setzt YAML auf eine minimalistische Syntax mit Einrückungen statt Klammern oder Tags. Das macht YAML-Dateien übersichtlich und leicht verständlich – sowohl für Menschen als auch für Maschinen.
Geschichte und Entwicklung von YAML
YAML wurde 2001 von Clark Evans vorgeschlagen, der gemeinsam mit Ingy döt Net und Oren Ben-Kiki an der Spezifikation arbeitete. Der ursprüngliche Name stand für "Yet Another Markup Language", wurde aber später in "YAML Ain't Markup Language" geändert – ein rekursives Akronym, das betont, dass YAML primär der Datenserialisierung dient und keine Auszeichnungssprache ist.
Wichtige Versionen
Die Entwicklung von YAML verlief über mehrere Versionen, die jeweils wichtige Verbesserungen brachten:
- YAML 1.0 (Januar 2004): Erste offizielle Spezifikation nach drei Jahren Entwicklungsarbeit
- YAML 1.1 (Januar 2005): Einführung von Tags zur expliziten Typisierung
- YAML 1.2 (Oktober 2009): YAML wird zum strikten Superset von JSON – jedes valide JSON-Dokument ist auch valides YAML
- YAML 1.2.2 (Oktober 2021): Aktuelle Version mit verbesserten Definitionen
Die Entscheidung, YAML zu einem JSON-Superset zu machen, war strategisch wichtig: Entwickler können JSON-Daten direkt in YAML-Dateien einbetten, ohne sie konvertieren zu müssen.
Syntax und Struktur
Die YAML-Syntax basiert auf Einrückungen mit Leerzeichen (keine Tabs!) und verzichtet weitgehend auf Klammern und Anführungszeichen. Das macht YAML-Dateien kompakt und gut lesbar. Die Einrückungstiefe definiert die Hierarchie der Daten – ähnlich wie in Python.
Schlüssel-Wert-Paare
Die grundlegendste Struktur in YAML sind Schlüssel-Wert-Paare, getrennt durch einen Doppelpunkt und ein Leerzeichen:
name: Max Mustermann
alter: 25
beruf: Fachinformatiker
aktiv: true
Listen und Arrays
Listen werden in YAML durch Bindestriche eingeleitet. Jeder Listeneintrag beginnt mit einem Bindestrich und einem Leerzeichen:
programmiersprachen:
- Python
- JavaScript
- Java
- PHP
Verschachtelte Strukturen
Durch Einrückung lassen sich beliebig tiefe Hierarchien abbilden. Das folgende Beispiel zeigt eine typische Konfiguration mit mehreren Ebenen:
datenbank:
host: localhost
port: 5432
name: produktionsdb
zugangsdaten:
benutzer: admin
passwort: ${DB_PASSWORD}
Mehrzeilige Texte
YAML bietet zwei Möglichkeiten für mehrzeilige Strings: Das Pipe-Zeichen (|) erhält Zeilenumbrüche, das Größer-als-Zeichen (>) fasst Text zu einer Zeile zusammen:
# Zeilenumbrüche werden erhalten
beschreibung: |
Dies ist die erste Zeile.
Dies ist die zweite Zeile.
Und hier die dritte.
# Text wird zu einer Zeile zusammengefasst
kurzbeschreibung: >
Diese Zeilen werden
zu einer einzigen Zeile
zusammengefügt.
Datentypen in YAML
YAML erkennt Datentypen automatisch anhand des Werts. Du kannst Strings, Zahlen, Booleans, Null-Werte und Datumsangaben verwenden, ohne sie explizit deklarieren zu müssen:
| Datentyp | Beispiel | Beschreibung |
|---|---|---|
| String | name: Hallo Welt |
Text, Anführungszeichen optional |
| Integer | anzahl: 42 |
Ganzzahlen |
| Float | preis: 19.99 |
Gleitkommazahlen |
| Boolean | aktiv: true |
true/false, yes/no, on/off |
| Null | wert: null |
Leerer Wert, auch ~ möglich |
| Datum | datum: 2024-01-15 |
ISO 8601 Format |
Bei Bedarf kannst du den Datentyp mit Tags explizit festlegen, etwa !!str 123 um die Zahl 123 als String zu behandeln.
YAML vs. JSON vs. XML
YAML, JSON und XML sind alle Formate zur Datenserialisierung, unterscheiden sich aber in Syntax und typischen Einsatzgebieten. Die folgende Tabelle zeigt die wichtigsten Unterschiede:
| Aspekt | YAML | JSON | XML |
|---|---|---|---|
| Lesbarkeit | Sehr gut | Gut | Mäßig |
| Kommentare | Ja (#) | Nein | Ja () |
| Syntax | Einrückung | Klammern {} [] | Tags <> |
| Datentypen | Automatisch erkannt | Begrenzt | Schema-definiert |
| Dateigröße | Kompakt | Kompakt | Verbose |
| Haupteinsatz | Konfiguration | API-Kommunikation | Dokumentenaustausch |
YAML eignet sich besonders dort, wo Menschen Dateien regelmäßig lesen und bearbeiten müssen. JSON ist Standard für APIs und Webkommunikation. XML findet man noch häufig in Enterprise-Anwendungen und bei komplexen Dokumentstrukturen mit Schema-Validierung.
Einsatzgebiete von YAML
YAML hat sich als Standardformat für Konfigurationsdateien in der modernen Softwareentwicklung etabliert. Die wichtigsten Anwendungsbereiche sind:
Docker Compose
Docker Compose nutzt YAML-Dateien zur Definition von Multi-Container-Anwendungen. In einer docker-compose.yml beschreibst du Services, Netzwerke und Volumes:
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- database
database:
image: postgres:16
environment:
POSTGRES_PASSWORD: geheim
POSTGRES_DB: webapp
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Kubernetes
Kubernetes verwendet YAML-Manifeste zur Beschreibung von Cluster-Ressourcen. Deployments, Services und ConfigMaps werden alle in YAML definiert:
apiVersion: apps/v1
kind: Deployment
metadata:
name: webserver
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
CI/CD-Pipelines
Continuous Integration und Continuous Deployment Systeme wie GitHub Actions, GitLab CI und Azure DevOps nutzen YAML zur Definition von Build- und Deployment-Pipelines:
# .github/workflows/ci.yml (GitHub Actions)
name: CI Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install
- run: npm test
Ansible
Ansible verwendet YAML für Playbooks zur Automatisierung von IT-Infrastruktur. Die deklarative Syntax beschreibt den gewünschten Zustand von Systemen:
# playbook.yml
- name: Webserver konfigurieren
hosts: webservers
become: true
tasks:
- name: Nginx installieren
apt:
name: nginx
state: present
- name: Nginx starten
service:
name: nginx
state: started
enabled: true
Best Practices für YAML
Um lesbare und wartbare YAML-Dateien zu erstellen, solltest du einige bewährte Praktiken beachten:
- Einheitliche Einrückung: Verwende immer 2 Leerzeichen pro Ebene (keine Tabs!)
- Kommentare nutzen: Erkläre komplexe Konfigurationen mit
#-Kommentaren - Strings quotieren bei Sonderzeichen: Nutze Anführungszeichen bei Strings mit Doppelpunkten oder anderen Sonderzeichen
- Anker und Aliase: Verwende
&und*für wiederverwendbare Konfigurationsblöcke - Validierung: Prüfe YAML-Dateien vor dem Deployment mit Linting-Tools
Anker und Aliase
Mit Ankern (&) und Aliasen (*) kannst du Konfigurationsblöcke wiederverwenden und Redundanz vermeiden:
# Definition eines Ankers
standard-logging: &logging
level: info
format: json
output: /var/log/app.log
services:
api:
logging: *logging # Referenziert den Anker
worker:
logging: *logging # Gleiche Konfiguration
Häufige Fehler vermeiden
YAML ist syntaktisch streng – kleine Fehler können zu schwer nachvollziehbaren Problemen führen. Die häufigsten Stolperfallen sind:
| Fehler | Problem | Lösung |
|---|---|---|
| Tabs statt Leerzeichen | YAML erlaubt keine Tabs | Editor auf Spaces konfigurieren |
| Inkonsistente Einrückung | Parsing-Fehler | Immer gleiche Anzahl Leerzeichen |
| Fehlende Anführungszeichen | ja wird als Boolean true interpretiert |
"ja" für Strings verwenden |
| Doppelpunkt in Werten | Wird als neues Key-Value-Paar interpretiert | String in Anführungszeichen setzen |
Ein häufiger Fehler bei deutschsprachigen Werten: Das Wort "ja" wird von YAML automatisch als Boolean true interpretiert. Um es als Text zu verwenden, musst du es in Anführungszeichen setzen: "ja".
YAML in der IT-Praxis
YAML-Kenntnisse gehören heute zum Standardrepertoire in der IT. Wer als Fachinformatiker für Anwendungsentwicklung oder Fachinformatiker für Systemintegration arbeitet, wird regelmäßig mit YAML-Konfigurationen in Kontakt kommen.
Im DevOps-Bereich ist YAML allgegenwärtig: Docker Compose, Kubernetes, CI/CD-Pipelines und Infrastructure-as-Code-Tools wie Ansible setzen alle auf YAML. Auch viele Frameworks und Anwendungen nutzen YAML für ihre Konfiguration – von Spring Boot bis Hugo.