Regeln, Standards, Kontextstruktur und Werkzeuge übernommen; 2nd-brain- Inhalte (Stacks, Ansible-Inventar, Architektur, Knowledge) entfernt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6.1 KiB
6.1 KiB
Ansible-Standard (verbindlich)
Gilt für alle Plays und Rollen in diesem Projekt. Verallgemeinert aus einem erprobten Homelab-Setup. Vorlagen:
templates/ansible/. Geheimnisse:rules/secrets.md.
1. Verzeichnislayout
<repo>/ansible/
├── .env.sh # setzt alle Pfade + Secret-Store-Variablen → source (bash/zsh)
├── ansible.cfg # Fact-Cache, become, Log – Pfade aus .env.sh
├── inv/
│ ├── <umgebung> # Inventar (INI oder YAML), z. B. prod, lab
│ ├── group_vars/all/ # globale Variablen (ansible_user, ans_files, Secret-Store-Pfade)
│ ├── group_vars/<gruppe>.yml
│ └── host_vars/<host>.yml
├── playbooks/ # ein Dienst = ein Play; Präambel = Doku
├── roles/<dienst>/ # Logik: tasks/ handlers/ defaults/ meta/ (keine templates/!)
└── files/<dienst>/ # alle Templates (*.j2) und Dateien – Rollen holen sie aus $ANS_FILES
.env.sh (interaktiv in der Shell gesourct, setzt ANSIBLE_*) ist bewusst etwas anderes als die .env der Bash-Scripts.
2. Aufruf & Umgebung
- Vor jedem Aufruf:
source ansible/.env.sh. Pfade nie hart codieren:$ANSIBLE_BASE_PATH,$ANS_PLAYDIR,$ANS_FILES(in YAML:ans_files). - Aufrufe immer:
ansible-playbook $ANS_PLAYDIR/<play>.yml [-e hostlist=…] [--check --diff]. .env.shsetzt fremdeANSIBLE_*-Variablen zurück (unset), damit kein Kontext eines anderen Repos durchschlägt.
| Variable | Zweck |
|---|---|
ANSIBLE_BASE_PATH |
Basis für alles |
ANSIBLE_CONFIG, ANSIBLE_INVENTORY, ANSIBLE_ROLES_PATH |
Standard-Ansible-Variablen |
ANS_PLAYDIR |
Playbooks |
ANS_FILES |
Templates/Dateien (YAML: ans_files) |
ANS_DEFAULT_HOSTS |
Dokumentation des Standardziels (s. § 3) |
VAULT_ADDR, ANSIBLE_HASHI_VAULT_*, ANS_VAULT_KV_MOUNT/PATH |
Secret-Store |
ANSIBLE_VAULT_PASSWORD_FILE |
nur wenn Datei existiert (Fallback Ansible Vault) |
3. Playbooks
- Präambel max. 12 Zeilen im Header-Format (
rules/headers.md):@file,@brief,@author,@owner,@version,@usagemit nötigen/optionalen-e-Variablen, Tags und Voraussetzungen. - Ziel immer
hosts: "{{ hostlist | default('<STANDARDHOST>') }}"– ohne-egenau ein bekannter, ungefährlicher Host (Lab/Test). Niealloder eine Produktivgruppe als Default. - Ein Dienst = ein Play (
radius.yml,dns.yml). Logik liegt inroles/<dienst>/; das Play bindet nur die Rolle ein. - Dateinamen: Kleinbuchstaben,
_statt-(vault_check.yml). - Standard-Hilfsplays je Repo:
mini_check.yml(Erreichbarkeit, Facts),vault_check.yml(Secret-Store erreichbar, nur Schlüsselnamen).
4. Rollen
- Rollenname = Dienst. Tasks thematisch teilen:
main.yml(Ablauf) →secrets.yml,install.yml,config.yml,verify.yml. main.ymlbeginnt mit einem Plattform-Check (ansible.builtin.assertaufansible_facts), Tagalways.- Templates liegen nicht in der Rolle, sondern in
files/<dienst>/; Zugriff über{{ ans_files }}/<dienst>/…. - Nur Dateien templaten, die wir „besitzen“. Paket-Defaults nicht komplett überschreiben.
- Konfiguration vor dem Restart prüfen: Handler-Kette Check → Restart (
listen/notify),meta: flush_handlersvorservice: started. Bei Fehler bleibt der laufende Dienst unberührt. - Jede Rolle hat einen Smoke-Test (
verify.yml, Tagverify,check_mode: false,changed_when: false). - Idempotent: zweiter Lauf
changed=0.command/shellnur mitcreates/changed_when. - Module mit FQCN (
ansible.builtin.…,community.…). Task-Namen in der Amtssprache, als Satz („Paket installieren“). - Variablen der Rolle mit Rollenpräfix (
radius_clients), Defaults indefaults/main.ymlmit Kommentar je Variable.
5. SSH-Performance
pipelining=True(Standard intemplates/ansible/ansible.cfg): Module laufen per stdin statt Kopie nach/tmp– spart je Task mehrere SSH-Roundtrips, typisch der größte Einzelgewinn. Voraussetzung: keinDefaults requirettyinsudoers(aktuelle Distros: Standard).- Dazu
ControlMaster=auto/ControlPersist=60s: eine SSH-Verbindung je Host wird wiederverwendet. - Bei Fehlern wie „sudo: sorry, you must have a tty“:
requirettyauf dem Ziel entfernen, nichtpipeliningabschalten.
6. Facts
gathering=smart+ Fact-Cache (jsonfile, 86400 s) ausansible.cfg. Facts nutzen statt Shell-Abfragen (ansible_facts['distribution_major_version']), Zugriff immer überansible_facts[...], nicht überansible_*-Kurzformen.- Facts neu sammeln:
ansible-playbook $ANS_PLAYDIR/mini_check.yml -e check_mode=setup.
7. Geheimnisse
- Secret-Store per
community.hashi_vault(Lookup insecrets.yml), Fallback Ansible Vault (vault_*-Variablen). - Tasks mit Geheimnissen
no_log: true, Templates mit Geheimnissendiff: false. Nicht entfernen. - Testbetrieb ohne Secret-Store:
-e <rolle>_secrets_source=vars -e @/pfad/außerhalb/testsecrets.yml.
8. Tags
install, config, verify; Plattform-Check und Secrets always.
9. Kommentare & Stil
- Deaktivierte, absichtlich behaltene Blöcke mit
#-#markieren. - YAML: 2 Leerzeichen,
---am Anfang,true/falsestattyes/no, Strings mit Jinja in Anführungszeichen. - Prüfen vor Abgabe:
ansible-lint,yamllint,ansible-playbook --syntax-check,--check --diff, Lauf gegen lokalen Testcontainer, Idempotenz (rules/testing.md).
10. Neue Rolle in 5 Schritten
- Original-Doku des Dienstes holen (
rules/web_search.md), Ergebnisse inknowledge/services/<dienst>.md. cp -r ai/common/templates/ansible/roles/example roles/<dienst>,files/example→files/<dienst>, Play ausplaybooks/example.yml.- Präfix
example_→<dienst>_, Header ausfüllen. - Lokal testen (Container), Idempotenz prüfen.
- Knowledge/
context.mdaktualisieren.
Änderungsprotokoll
- 07.10.2026 – angelegt, verallgemeinert aus infra-devices/ansible.
- 08.10.2026 – § 5 SSH-Performance (pipelining, ControlPersist) als Vorgabe – Wunsch des Bedieners.
- 23.10.2026 – Mandantenbezug entfernt (Einzelprojekt).