# Ansible — Server agentenlos automatisieren und provisionieren

> Praxis-Guide zu Ansible — agentenlose IT-Automatisierung über SSH, mit YAML-Playbooks provisionieren, deployen, konfigurieren und Secrets per Vault schützen.

Source: https://www.jpkc.com/db/cheatsheets/cloud-iac/ansible/

<!-- PROSE:intro -->
Ansible ist ein agentenloses Automatisierungswerkzeug von Red Hat, mit dem du Server provisionierst, konfigurierst und Software ausrollst – ohne dass auf den verwalteten Hosts ein Agent laufen muss. Alles läuft über reines SSH, und dein gewünschter Zustand steckt als Code in deklarativen YAML-Playbooks. Hinter dem Namen stehen mehrere Binaries: `ansible` für Ad-hoc-Befehle, `ansible-playbook` für komplette Abläufe, dazu `ansible-galaxy`, `ansible-vault` und `ansible-inventory`. Dieser Guide führt dich vom schnellen Ping über strukturierte Playbooks bis zur verschlüsselten Secrets-Verwaltung.
<!-- PROSE:intro:end -->

## Ad-hoc-Befehle

`ansible <hosts> -m ping` — Erreichbarkeit der Hosts testen.

```bash
ansible all -m ping
```

`ansible <hosts> -a '<command>'` — Einen Shell-Befehl auf den Remote-Hosts ausführen.

```bash
ansible webservers -a 'uptime'
```

`ansible <hosts> -m <module> -a '<args>'` — Ein Modul mit Argumenten ausführen.

```bash
ansible webservers -m apt -a 'name=nginx state=present' -b
```

`ansible <hosts> -m copy -a 'src=<src> dest=<dest>'` — Eine Datei auf die Remote-Hosts kopieren.

```bash
ansible all -m copy -a 'src=config.conf dest=/etc/app/config.conf' -b
```

`ansible <hosts> -m service -a 'name=<svc> state=restarted'` — Einen Dienst auf den Remote-Hosts neu starten.

```bash
ansible webservers -m service -a 'name=nginx state=restarted' -b
```

`ansible <hosts> -b -a '<command>'` — Befehl mit Rechte-Eskalation (`become`/sudo) ausführen.

```bash
ansible all -b -a 'apt update'
```

## Playbooks

`ansible-playbook <playbook>` — Ein Playbook ausführen.

```bash
ansible-playbook site.yml
```

`ansible-playbook <playbook> -i <inventory>` — Mit einer bestimmten Inventory-Datei ausführen.

```bash
ansible-playbook deploy.yml -i production/hosts
```

`ansible-playbook <playbook> --check` — Trockenlauf: zeigt geplante Änderungen, ohne sie anzuwenden.

```bash
ansible-playbook site.yml --check
```

`ansible-playbook <playbook> --diff` — Datei-Unterschiede bei Änderungen anzeigen.

```bash
ansible-playbook site.yml --diff
```

`ansible-playbook <playbook> -l <hosts>` — Ausführung auf bestimmte Hosts beschränken.

```bash
ansible-playbook site.yml -l webserver01
```

`ansible-playbook <playbook> -t <tags>` — Nur Tasks mit bestimmten Tags ausführen.

```bash
ansible-playbook site.yml -t nginx,deploy
```

`ansible-playbook <playbook> -e '<key>=<value>'` — Zusätzliche Variablen übergeben.

```bash
ansible-playbook deploy.yml -e 'version=2.0 env=production'
```

## Inventory

`ansible-inventory --list` — Das vollständige Inventory im JSON-Format anzeigen.

```bash
ansible-inventory --list -i hosts.yml
```

`ansible-inventory --graph` — Inventory als Baumstruktur anzeigen.

```bash
ansible-inventory --graph
```

`ansible <hosts> --list-hosts` — Anzeigen, welche Hosts auf ein Muster passen.

```bash
ansible webservers --list-hosts
```

`ansible-playbook <playbook> --list-tasks` — Alle Tasks eines Playbooks auflisten.

```bash
ansible-playbook site.yml --list-tasks
```

`ansible-playbook <playbook> --list-tags` — Alle Tags eines Playbooks auflisten.

```bash
ansible-playbook site.yml --list-tags
```

## Galaxy & Rollen

`ansible-galaxy init <role>` — Eine neue Rollen-Verzeichnisstruktur anlegen.

```bash
ansible-galaxy init my-role
```

`ansible-galaxy install <role>` — Eine Rolle aus der Ansible Galaxy installieren.

```bash
ansible-galaxy install geerlingguy.docker
```

`ansible-galaxy install -r requirements.yml` — Rollen aus einer Requirements-Datei installieren.

```bash
ansible-galaxy install -r requirements.yml
```

`ansible-galaxy collection install <collection>` — Eine Ansible-Collection installieren.

```bash
ansible-galaxy collection install community.docker
```

`ansible-galaxy list` — Installierte Rollen auflisten.

```bash
ansible-galaxy list
```

## Vault (Secrets)

`ansible-vault create <file>` — Eine neue verschlüsselte Datei anlegen.

```bash
ansible-vault create secrets.yml
```

`ansible-vault edit <file>` — Eine verschlüsselte Datei bearbeiten.

```bash
ansible-vault edit secrets.yml
```

`ansible-vault encrypt <file>` — Eine vorhandene Datei verschlüsseln.

```bash
ansible-vault encrypt vars/passwords.yml
```

`ansible-vault decrypt <file>` — Eine verschlüsselte Datei entschlüsseln.

```bash
ansible-vault decrypt secrets.yml
```

`ansible-vault view <file>` — Eine verschlüsselte Datei ansehen, ohne sie zu entschlüsseln.

```bash
ansible-vault view secrets.yml
```

`ansible-playbook <playbook> --ask-vault-pass` — Playbook ausführen und nach dem Vault-Passwort fragen.

```bash
ansible-playbook site.yml --ask-vault-pass
```

`ansible-vault encrypt_string '<string>' --name '<var>'` — Eine einzelne Zeichenkette zur Verwendung in YAML verschlüsseln.

```bash
ansible-vault encrypt_string 'mysecret' --name 'db_password'
```

## Debugging & Konfiguration

`ansible-playbook <playbook> -v` — Mit ausführlicher Ausgabe laufen lassen (-v, -vv, -vvv, -vvvv).

```bash
ansible-playbook site.yml -vvv
```

`ansible-config dump` — Alle Konfigurationseinstellungen anzeigen.

```bash
ansible-config dump --only-changed
```

`ansible-doc <module>` — Dokumentation zu einem Modul anzeigen.

```bash
ansible-doc ansible.builtin.apt
```

`ansible-doc -l` — Alle verfügbaren Module auflisten.

```bash
ansible-doc -l | grep docker
```

`ansible-playbook <playbook> --syntax-check` — Playbook-Syntax prüfen, ohne es auszuführen.

```bash
ansible-playbook site.yml --syntax-check
```

`ansible-playbook <playbook> --step` — Playbook Schritt für Schritt mit Bestätigung ausführen.

```bash
ansible-playbook site.yml --step
```

<!-- PROSE:outro -->
## Fazit

Mit demselben Werkzeugkasten deckst du beides ab: schnelle Ad-hoc-Eingriffe und reproduzierbare, in YAML versionierte Playbooks – idempotent, sodass mehrfaches Ausführen denselben Zielzustand herstellt. Geh bei heiklen Änderungen erst mit `--check` und `--diff` in den Trockenlauf, bevor du sie wirklich anwendest, denn ad hoc abgesetzte `shell`- oder `command`-Aufrufe und `state=absent` wirken sofort und unwiderruflich. Halte Secrets ausschließlich in `ansible-vault` verschlüsselt – niemals im Klartext ins Git-Repository – und setze `-b`/`--become` nur dort, wo du echte Root-Rechte brauchst.

## Weiterführende Links

- [Ansible-Dokumentation](https://docs.ansible.com/) – offizielle Referenz zu Playbooks, Modulen und Inventory (englisch)
- [Ansible-Vault – Secrets verschlüsseln](https://docs.ansible.com/ansible/latest/vault_guide/index.html) – offizieller Leitfaden zur sicheren Verwaltung von Secrets (englisch)
- [Ansible](https://de.wikipedia.org/wiki/Ansible_(Software)) – Hintergrund und Einordnung in der deutschsprachigen Wikipedia
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [aws](https://www.jpkc.com/db/cheatsheets/cloud-iac/aws/) – Kommandozeilen-Client für Amazon-Web-Services-Ressourcen
- [terraform](https://www.jpkc.com/db/cheatsheets/cloud-iac/terraform/) – deklaratives Infrastructure-as-Code über Provider hinweg

