TL;DR — Kurzzusammenfassung
Ansible Vault verschluesselt Geheimnisse in Playbooks mit AES-256. Lernen Sie vault create, encrypt_string, Vault IDs, CI/CD-Integration und Passwortrotation.
Datenbankpasswoerter, API-Schluessel und private SSL-Schluessel im Klartext in Ihren Ansible-Playbooks zu speichern ist einer der haeufigsten Sicherheitsfehler bei der Infrastrukturautomatisierung. Sobald ein Geheimnis unverschluesselt in einem Git-Repository landet, ist es faktisch kompromittiert — der Git-Verlauf bleibt dauerhaft erhalten, und jeder mit Lesezugriff auf das Repository kann es abrufen. Ansible Vault loest dieses Problem, indem Geheimnisse direkt in Ihrem Repository mit AES-256 verschluesselt werden, sodass Sie verschluesselte Credential-Dateien neben Ihren Playbooks committen koennen, ohne sensible Daten preiszugeben.
Voraussetzungen
Bevor Sie mit diesem Leitfaden arbeiten, sollten Sie haben:
- Ansible 2.8 oder spaeter auf Ihrem Steuerknoten installiert (
ansible --versionzur Verifizierung) - Grundlegende Vertrautheit mit Ansible-Playbooks und der group_vars-Verzeichnisstruktur
- Ein bestehendes Ansible-Projekt mit Inventar und mindestens einem Playbook
- Einen Texteditor als Ihr
$EDITORkonfiguriert (nano, vim oder VS Code) - Fuer CI/CD-Abschnitte: eine GitHub Actions-, GitLab CI- oder Jenkins-Pipeline, die Sie anpassen koennen
Neu bei Ansible? Lesen Sie zuerst unseren Ansible-Einstiegsleitfaden, um Ihre Projektstruktur einzurichten, bevor Sie Vault hinzufuegen.
Warum Klartext-Geheimnisse in Playbooks Gefaehrlich Sind
Jedes im Klartext gespeicherte Geheimnis in einem Git-Repository tragt dasselbe Risiko: Exposition. Betrachten Sie, was typischerweise ohne Vault in Ansible-Variablendateien landet:
- Datenbank-Root-Passwoerter in
group_vars/dbservers.yml - AWS-Zugriffsschluessel in
host_vars/deploy.yml - SMTP-Zugangsdaten in
roles/notifications/defaults/main.yml - Privater SSL-Schlussel-Inhalt in einem
vars:-Block in einem Playbook
Jedes der folgenden Ereignisse legt diese Geheimnisse sofort offen: ein versehentlich oeffentlich gemachtes Repository, ein kompromittiertes GitHub-Konto eines Mitarbeiters, ein durchgesickertes CI/CD-Protokoll oder ein unzufriedener ehemaliger Mitarbeiter. Ansible Vault verhindert dies, indem sichergestellt wird, dass in git gespeicherte Dateien nur AES-256-verschluesselten Chiffretext enthalten, nicht die eigentlichen Geheimniswerte.
Das Vault-Passwort selbst gelangt nie in Ihr Repository. Es bleibt in Ihrem Gedaechtnis, in einem Passwortmanager oder im Secrets-Store Ihres CI/CD-Systems — getrennt vom Code.
Verschluesselte Dateien mit ansible-vault create Erstellen
Der Unterbefehl create oeffnet Ihren konfigurierten $EDITOR mit einer leeren Datei, laesst Sie Ihre Geheimnisse eingeben und speichert die Datei verschluesselt beim Schliessen des Editors:
ansible-vault create group_vars/all/vault.yml
Sie werden nach einem neuen Vault-Passwort gefragt (zweimal zur Bestaetigung). Der Editor oeffnet sich. Geben Sie Ihre Geheimnisse ein:
vault_db_password: "Tr0ub4dor&3"
vault_db_root_password: "R4nd0mS33d#9"
vault_api_key: "sk-live-abc123def456ghi789"
vault_smtp_password: "M@ilS3rv1c3P@ss"
vault_ssl_private_key: |
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA3cH7...
-----END RSA PRIVATE KEY-----
Speichern und schliessen. Die Datei auf der Festplatte enthaelt jetzt nur den verschluesselten Blob:
$ANSIBLE_VAULT;1.1;AES256
66386439653763616335616230333934356262313032393132376163633335636630
34663437326664303537373561373039636131336531353364386530636431343739
...
Verschluesselte Dateien bearbeiten und anzeigen
# Im Editor fuer Aenderungen oeffnen
ansible-vault edit group_vars/all/vault.yml
# Entschluesselten Inhalt ohne Bearbeiten anzeigen
ansible-vault view group_vars/all/vault.yml
# Eine bestehende Klartext-Datei verschluesseln
ansible-vault encrypt secrets.yml
# Eine Datei zurueck in Klartext entschluesseln (mit Vorsicht verwenden)
ansible-vault decrypt secrets.yml
Einzelne Variablen mit encrypt_string Verschluesseln
Manchmal moechten Sie ein einzelnes Geheimnis in einer Nicht-Vault-Datei — vielleicht weil Sie den umgebenden Kontext ohne Entschluesseln von allem sichtbar haben moechten. Der Unterbefehl encrypt_string erzeugt einen verschluesselten Wert, den Sie direkt in eine YAML-Datei einfuegen koennen:
ansible-vault encrypt_string --name 'vault_stripe_key' 'sk_live_abc123xyz'
Ausgabe:
vault_stripe_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
66653465346564383664396631316639
37313739623731633864333736396230
...
Fuegen Sie diesen Block direkt in eine beliebige YAML-Variablendatei ein. Ansible entschluesselt ihn transparent zur Laufzeit, genauso wie es mit einer vollstaendig verschluesselten Vault-Datei umgeht.
Wann encrypt_string vs. verschluesselte Dateien verwenden:
| Ansatz | Verwenden wenn |
|---|---|
ansible-vault create vault.yml | Die meisten Faelle — haelt Geheimnisse organisiert, einfach zu pruefen |
encrypt_string | Einzelnes Geheimnis in einer hauptsaechlich klaren Datei; Inline-Geheimnisse in Roles |
| Ganzes Playbook verschluesselt | Selten benoetigt; beeintraechtigt die Lesbarkeit |
Vault IDs: Mehrere Passwoerter fuer Verschiedene Geheimnis-Sets
Vault IDs ermoglichen die Kennzeichnung verschluesselter Inhalte, damit Ansible weiss, welches Passwort anzuwenden ist. Dies ist entscheidend, wenn Staging und Produktion unterschiedliche Passwoerter verwenden oder wenn Sie ein Passwort rotieren moechten, ohne alles neu zu verschluesseln.
Mit einer Vault ID verschluesseln
# Mit einer benannten Vault ID verschluesseln
ansible-vault create --vault-id prod@prompt group_vars/production/vault.yml
ansible-vault create --vault-id staging@prompt group_vars/staging/vault.yml
# Oder auf eine Passwortdatei zeigen
ansible-vault create --vault-id prod@~/.vault_prod group_vars/production/vault.yml
Mit mehreren Vault IDs entschluesseln
ansible-playbook site.yml \
--vault-id prod@~/.vault_prod \
--vault-id staging@~/.vault_staging
Ansible ordnet jeden verschluesselten Block automatisch seiner Vault-ID-Bezeichnung zu und verwendet das richtige Passwort. Inhalte, die ohne explizite Vault ID verschluesselt wurden, verwenden standardmaessig die Bezeichnung default.
CI/CD-Integration mit —vault-password-file
Interaktive Passworteingaben blockieren automatisierte Pipelines. Das Flag --vault-password-file akzeptiert einen Pfad zu einer Datei, die nur das Vault-Passwort enthaelt, und ermoeglicht eine vollstaendig nicht interaktive Ausfuehrung.
Beispiel mit GitHub Actions
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Ansible installieren
run: pip install ansible
- name: Vault-Passwort in Datei schreiben
run: echo "${{ secrets.ANSIBLE_VAULT_PASSWORD }}" > ~/.vault_pass
- name: Playbook ausfuehren
run: |
ansible-playbook -i inventory/production site.yml \
--vault-password-file ~/.vault_pass
- name: Vault-Passwortdatei entfernen
if: always()
run: rm -f ~/.vault_pass
Speichern Sie ANSIBLE_VAULT_PASSWORD in den GitHub Actions Secrets des Repositories (Einstellungen → Secrets → Actions). Das Vault-Passwort erscheint nie in Protokollen, da GitHub Geheimniswerte maskiert.
Beispiel mit GitLab CI
# .gitlab-ci.yml
deploy:
script:
- echo "$ANSIBLE_VAULT_PASSWORD" > ~/.vault_pass
- ansible-playbook -i inventory/production site.yml --vault-password-file ~/.vault_pass
- rm -f ~/.vault_pass
variables:
ANSIBLE_VAULT_PASSWORD: $ANSIBLE_VAULT_PASSWORD
Ein Vault-Passwortskript verwenden
Fuer dynamische Vault-Passwoerter (zur Laufzeit von HashiCorp Vault, AWS Secrets Manager oder Azure Key Vault abgerufen) erstellen Sie ein ausfuehrbares Skript, das das Passwort ausgibt:
#!/bin/bash
# ~/.get_vault_pass.sh
aws secretsmanager get-secret-value \
--secret-id ansible/vault-password \
--query SecretString \
--output text
chmod +x ~/.get_vault_pass.sh
ansible-playbook site.yml --vault-password-file ~/.get_vault_pass.sh
Best Practices: Vault-Variablen Organisieren
Das wartbarste Muster trennt Ihre Variablendateien in zwei parallele Dateien pro Gruppe:
group_vars/
all/
vars.yml # einfache Variablen + Referenzen auf vault_-Variablen
vault.yml # verschluesselt, nur vault_-Praefix-Variablen
production/
vars.yml
vault.yml
staging/
vars.yml
vault.yml
group_vars/all/vars.yml — Klartext, sicher in git zu pruefen:
# group_vars/all/vars.yml
db_host: "db.internal.example.com"
db_port: 5432
db_name: "myapp_prod"
db_password: "{{ vault_db_password }}" # Referenz, nicht der Wert
api_endpoint: "https://api.stripe.com/v1"
stripe_key: "{{ vault_stripe_key }}"
smtp_host: "smtp.sendgrid.net"
smtp_user: "apikey"
smtp_password: "{{ vault_smtp_password }}"
group_vars/all/vault.yml — verschluesselt, alle mit vault_-Praefix:
# group_vars/all/vault.yml (diese Datei ist auf der Festplatte verschluesselt)
vault_db_password: "Tr0ub4dor&3"
vault_stripe_key: "sk_live_abc123"
vault_smtp_password: "SG.abc123xyz"
Vorteile dieses Musters:
- Playbooks referenzieren lesbare Namen (
db_password), nicht Vault-Variablen direkt git diffzeigt Aenderungen in dervars.yml-Struktur ohne das Vault-Passwort zu benoetigen- Sie koennen pruefen, welche Variablen in der Vault-Datei nach Namen existieren (fuehren Sie
ansible-vault viewaus) - Neue Teammitglieder koennen
vars.ymllesen, um die Variablenstruktur ohne Vault-Zugang zu verstehen
Vault-Passwoerter mit rekey Rotieren
Das Rotieren des Vault-Passworts ist ein Einzeilen-Befehl:
ansible-vault rekey group_vars/all/vault.yml
Sie werden nach dem aktuellen Vault-Passwort gefragt, dann muessen Sie das neue Passwort eingeben und bestaetigen. Die Datei wird an Ort und Stelle neu verschluesselt. Waehrend dieses Vorgangs werden keine Geheimnisse auf die Festplatte entschluesselt.
Fuer mehrere Vault-Dateien auf einmal:
# Alle Vault-Dateien im Projekt neu verschluesseln
find . -name "vault.yml" -exec ansible-vault rekey {} \;
# Oder mit --new-vault-password-file fuer nicht interaktive Rotation
ansible-vault rekey \
--vault-password-file ~/.old_vault_pass \
--new-vault-password-file ~/.new_vault_pass \
group_vars/all/vault.yml group_vars/production/vault.yml
Aktualisieren Sie nach dem Rekey Ihren CI/CD-Secret-Store mit dem neuen Passwort, bevor die naechste Pipeline ausgefuehrt wird.
Ansible Vault mit AWX und Semaphore Verwenden
AWX / Ansible Tower
AWX verfuegt ueber einen nativen Credential-Typ fuer Ansible Vault. Erstellen Sie ein Credential vom Typ Vault (Einstellungen → Credentials → Hinzufuegen → Vault), geben Sie das Vault-Passwort ein und weisen Sie es Ihrer Job-Vorlage zu. AWX uebergibt das Passwort sicher ohne es in der Job-Ausgabe preiszugeben.
Fuer mehrere Vault IDs in AWX erstellen Sie ein Vault-Credential pro ID und weisen alle der Job-Vorlage zu.
Semaphore UI
Semaphore speichert Vault-Passwoerter in seinem Key Store. Navigieren Sie zu Key Store → Neuer Schluessel, waehlen Sie den Typ Passwort, geben Sie Ihr Vault-Passwort ein und benennen Sie es (z.B. vault-production). Beim Erstellen einer Task-Vorlage waehlen Sie den Vault-Schluessel im Feld Vault Password.
Semaphore uebergibt den Schluessel an Ansible ueber eine temporaere Datei, die nach dem Playbook-Durchlauf geloescht wird — entsprechend dem gleichen Sicherheitsmodell wie der Passwortdatei-Ansatz in CI/CD.
Vergleich: Ansible Vault vs. Alternativen
| Tool | Verschluesselung | Git-nativ | CI/CD | Dynamische Geheimnisse | Komplexitaet |
|---|---|---|---|---|---|
| Ansible Vault | AES-256 | Ja — Dateien im Repo | Passwortdatei | Ueber Skript | Niedrig |
| HashiCorp Vault | AES-256-GCM | Nein — externer Dienst | API + Token | Ja (Leases) | Hoch |
| SOPS | AES-256 / PGP / KMS | Ja — verschluesselte Werte | KMS-Schluessel | Nein | Mittel |
| git-crypt | AES-256 | Ja — transparent | GPG-Schluessel | Nein | Mittel |
Waehlen Sie Ansible Vault, wenn Ihre Geheimnisse nur von Ansible-Playbooks zugreifbar sein muessen und Sie keine zusaetzliche Infrastruktur wollen. Waehlen Sie HashiCorp Vault, wenn Sie dynamische Geheimnisse, feinkoernigen Lease-Ablauf oder Multi-Anwendungs-Geheimniszugang benoetigen. SOPS ist nuetzlich, wenn Sie verschluesselte Dateien benoetigen, die von anderen Tools als Ansible (Terraform, Helm) gelesen werden koennen. git-crypt funktioniert gut fuer allgemeine verschluesselte Dateien in einem Repo, hat aber keine Ansible-spezifischen Integrationen.
Praxisszenario: DB-Zugangsdaten und API-Schluessel in Mehreren Umgebungen
Sie verwalten drei Umgebungen (Entwicklung, Staging, Produktion) fuer eine Webanwendung. Jede Umgebung hat eine PostgreSQL-Datenbank, einen Stripe-API-Schluessel und ein SendGrid-SMTP-Passwort. Die Entwicklung verwendet schwache lokale Passwoerter; die Produktion verwendet starke Zugangsdaten, die vom Sicherheitsteam verwaltet werden.
Verzeichnisstruktur:
projekt/
ansible.cfg
inventory/
development/hosts
staging/hosts
production/hosts
group_vars/
all/
vars.yml # gemeinsame Variablenstruktur
development/
vars.yml # nicht sensible Dev-Konfiguration
vault.yml # verschluesselte Dev-Geheimnisse (getrenntes Passwort)
staging/
vars.yml
vault.yml # verschluesselte Staging-Geheimnisse
production/
vars.yml
vault.yml # verschluesselte Produktions-Geheimnisse (am meisten eingeschraenkt)
playbooks/
deploy.yml
db_setup.yml
Die vault.yml jeder Umgebung verwendet eine separate Vault ID und ein separates Passwort, verwaltet vom jeweiligen Team:
# Entwicklungs-Vault erstellen (Passwort des Entwicklerteams)
ansible-vault create --vault-id dev@prompt group_vars/development/vault.yml
# Staging-Vault erstellen (Passwort des QA-Teams)
ansible-vault create --vault-id staging@prompt group_vars/staging/vault.yml
# Produktions-Vault erstellen (Passwort des Ops-Teams)
ansible-vault create --vault-id prod@prompt group_vars/production/vault.yml
Deployment-Pipeline (nur Produktion):
ansible-playbook -i inventory/production playbooks/deploy.yml \
--vault-id prod@~/.vault_prod
Das Produktions-Vault-Passwort wird nie mit Entwicklern oder QA geteilt. Wenn der Staging-Vault kompromittiert wird, sind die Produktionsgeheimnisse nicht betroffen, da sie ein vollstaendig getrenntes Passwort verwenden.
Fallstricke und Sonderfaelle
Das Vault-Passwort zu vergessen ist permanent. Es gibt keinen Wiederherstellungsmechanismus. Die verschluesselten Daten sind verloren. Speichern Sie Vault-Passwoerter sofort nach der Erstellung in einem Passwortmanager und in einem CI/CD-Geheimnis.
Vermeiden Sie --ask-vault-pass in der Automatisierung. Dies blockiert Pipelines und erfordert interaktive Eingabe. Verwenden Sie immer --vault-password-file in nicht interaktiven Kontexten.
ansible.cfg kann Vault-Standardwerte setzen. Fuegen Sie vault_password_file = ~/.vault_pass zu Ihrer ansible.cfg hinzu, um die Angabe bei jedem Befehl zu vermeiden.
vault.yml-Dateien sollten nie in .gitignore sein. Das Ziel ist, sie verschluesselt zu committen. Wenn Sie versucht sind, eine Vault-Datei in git zu ignorieren, haben Sie sie wahrscheinlich versehentlich im Klartext belassen.
Verschluesselte Dateien erscheinen bei identischer Neu-Verschluesselung immer noch als geaendert in git. AES-256 im CBC-Modus erzeugt bei jeder Verschluesselung unterschiedlichen Chiffretext fuer denselben Klartext. Fuehren Sie ansible-vault encrypt nicht bei unveraenderten Dateien aus, da dies den Git-Verlauf verschmutzt.
Binaere Dateien koennen ebenfalls verschluesselt werden. SSL-Zertifikate, Keystore-Dateien und SSH-Schluessel im Binaerformat koennen alle mit ansible-vault encrypt verschluesselt werden. Ansible entschluesselt sie in eine temporaere Datei, bevor es den Pfad an das jeweilige Modul uebergibt.
Fehlerbehebung
Fehler “Decryption failed” (Entschluesselung fehlgeschlagen):
# Ueberpruefen Sie, ob das Passwort korrekt ist, indem Sie die Datei anzeigen
ansible-vault view group_vars/all/vault.yml
# Pruefen Sie, ob die Vault ID uebereinstimmt, wenn Sie Vault IDs verwenden
ansible-vault view --vault-id prod@prompt group_vars/production/vault.yml
Das Playbook wird ohne Aufforderung nach dem Vault-Passwort ausgefuehrt und verwendet den falschen Wert:
Pruefen Sie, ob vault_password_file in ansible.cfg gesetzt ist. Wenn die Datei nicht existiert oder leer ist, ueberspringt Ansible die Vault-Entschluesselung stillschweigend. Fuegen Sie voruebergehend --ask-vault-pass hinzu, um zu bestaetigen.
Fehler “File is not encrypted” (Datei ist nicht verschluesselt) beim Bearbeiten:
Die Datei wird als Klartext gespeichert. Verschluesseln Sie sie zuerst: ansible-vault encrypt filename.yml.
Die Variable zeigt den Literalstring {{ vault_db_password }} in der Task-Ausgabe:
Die Variable wird referenziert, aber die Vault-Datei wurde nicht geladen. Vergewissern Sie sich, dass die Vault-Datei in einem Pfad liegt, den Ansible automatisch laedt (group_vars/, host_vars/), oder fuegen Sie sie explizit mit vars_files: im Playbook hinzu.
Die CI/CD-Pipeline zeigt das Vault-Passwort in den Protokollen:
Uebergeben Sie das Vault-Passwort nie als Befehlszeilenargument. Schreiben Sie immer zuerst in eine Datei. Bestaetigen Sie, dass Ihr CI-Anbieter die geheime Variable in der Protokollausgabe maskiert.
Zusammenfassung
- Speichern Sie alle Geheimnisse in mit
ansible-vault createverschluesseltengroup_vars/*/vault.yml-Dateien - Verwenden Sie die
vault_-Praefix-Konvention, um verschluesselte Variablen von einfachen zu unterscheiden - Referenzieren Sie Vault-Variablen aus einfachen
vars.yml-Dateien mit{{ vault_varname }}, damit Playbooks lesbar bleiben - Verwenden Sie
encrypt_stringnur fuer einzelne Inline-Geheimnisse, nicht als Hauptmuster fuer Geheimnisse - Verwenden Sie Vault IDs, um separate Passwoerter fuer verschiedene Umgebungen oder Teams zu verwalten
- Integrieren Sie mit CI/CD ueber
--vault-password-fileund speichern Sie das Passwort in Ihrem Secrets-Manager - Rotieren Sie Vault-Passwoerter mit
ansible-vault rekeyund aktualisieren Sie CI/CD-Geheimnisse sofort - Speichern Sie niemals Vault-Passwoerter in Dateien, die in git committet werden
- AWX und Semaphore haben nativen Vault-Credential-Support — bevorzugen Sie diesen gegenueber alternativen Loesungen