Lokales Tooling¶
Diese Seite erklärt, welche Werkzeuge auf deinem Rechner laufen, welches Werkzeug welchen Teil der Infrastruktur verwaltet und warum es genau diese sind.
Die Werkzeuge¶
Alles, was wir per Code verwalten, rollen wir von unseren eigenen Rechnern aus aus: Die Konfiguration liegt im Repo, und Werkzeuge übertragen sie auf die Server und zu den Anbietern. Diese Arbeitsweise heißt GitOps; warum wir so arbeiten, steht in Infrastructure as Code. Dafür nutzen wir diese Werkzeuge:
| Werkzeug | Aufgabe | Ordner im Repo |
|---|---|---|
| git | speichert alle Änderungen am Repo als Historie und gleicht sie mit Codeberg ab | das ganze Repo |
| CUE | Sprache, in der die Konfiguration von Hosts und DNS geschrieben ist; prüft sie und startet mit cue cmd plan und cue cmd apply das Ausrollen |
syslet/, desec/, cue.mod/ |
| syslet | richtet Container, Volumes, Netzwerke und Secrets auf den Hosts ein | syslet/, ein Ordner je Host |
| SOPS | ver- und entschlüsselt die Secrets | syslet/<host>/creds-*.enc.yaml, Regeln in syslet/.sops.yaml |
| desync | überträgt die DNS-Einträge zu deSEC | desec/ |
| Terraform | richtet in Authentik Anwendungen, Provider, Gruppen und Rollen ein | apps/authentik/tf-core/, apps/authentik/tf-groups/ |
Dazu kommt SSH, über das syslet die Hosts erreicht. Wo im Repo was liegt, beschreibt Repo-Aufbau ausführlicher.
Warum gerade diese¶
- syslet
- Für die Container auf unseren Hosts gibt es mehrere bekannte Wege, und alle hatten für uns einen Haken. Bei Docker und Compose verwaltet ein eigener Dienst die Container statt systemd, und Dateien müssen von Hand auf den Host. Quadlet-Dateien von Hand zu pflegen, lässt alte Konfiguration und Volumes liegen. Mit Ansible schreibt man die Schritte selbst und übersieht leicht einen Sonderfall, und Kubernetes ist für einzelne Hosts zu schwer. syslet setzt auf Podman und systemd auf und ergänzt nur, was fehlt: eine deklarative Beschreibung, eine Vorschau mit plan, ein apply, das auch Veraltetes entfernt, und einen Schutz gegen versehentliches Löschen. Mehr dazu: Why syslet in der syslet-Doku
- CUE
- syslet liest seine Beschreibung als JSON, und CUE erzeugt dieses JSON aus unseren Dateien.
Dafür passt CUE gut: Es ist eine Sprache für Konfiguration, prüft die Werte gegen ein Schema, bevor etwas ausgerollt wird, und bringt mit
cue fmteine einheitliche Formatierung mit. Mehr dazu: CUE lesen - SOPS
- Secrets sollen nicht im Klartext im Repo liegen. SOPS verschlüsselt sie in den Dateien selbst; die verschlüsselten Dateien liegen im Repo, und syslet entschlüsselt sie erst auf dem Host. Warum sie im Repo liegen und nicht in einem Passwortmanager oder in HashiCorp Vault: Secrets im Repo
- desync
- Ein selbst gebautes Werkzeug, das unsere DNS-Zonen bei deSEC wie die Hosts aus CUE-Dateien mit plan und apply ausrollt, einschließlich der Token-Policies. Warum wir es dafür brauchen: Verwaltung mit desync
- Terraform
- Ein weiteres Werkzeug wollten wir eigentlich vermeiden. Für Authentik gibt es aber einen offiziellen Terraform-Provider des Herstellers und kein syslet- oder CUE-Gegenstück. Warum wir Authentik überhaupt per Code verwalten, steht in Authentik. Mehr dazu: Terraform
Wie die Werkzeuge zusammenhängen¶
flowchart LR
subgraph rechner ["Dein Rechner"]
git["git"]
cue["CUE<br>cue cmd plan / apply"]
desync["desync"]
sops["SOPS"]
tf["Terraform"]
end
codeberg[("Repo<br>auf Codeberg")]
hosts["werner, containerhost<br>syslet"]
desec["deSEC"]
authentik["Authentik"]
git <-->|Push und Pull| codeberg
cue -->|SSH| hosts
cue --> desync
desync -->|API| desec
tf -->|API| authentik
Bei den Hosts gibt CUE die Konfiguration per SSH an syslet weiter, das auf dem Host selbst läuft und dort die Container einrichtet. Bei DNS ruft CUE desync auf deinem Rechner auf, das die Einträge über die API zu deSEC überträgt.
Terraform läuft ohne CUE und spricht direkt mit der API von Authentik.
SOPS braucht man nur, um Secrets anzulegen, zu ändern oder nachzusehen; zum Ausrollen nicht, weil erst der Host sie entschlüsselt (siehe Secrets im Repo).
Wie man die Werkzeuge installiert und einrichtet, steht in Arbeitsrechner einrichten.
Beispiel aus dem Repo¶
In syslet/syslet_tool.cue steht, was cue cmd plan und cue cmd apply für die Hosts tun: Sie verbinden sich per SSH mit dem Host und übergeben syslet dort die Konfiguration.
Das Gegenstück für DNS ist desec/desync_tool.cue, das dieselben Befehle an desync weitergibt.
Die syslet-Doku¶
Allgemeines zu syslet steht in der syslet-Doku, nicht hier. Zum Einstieg diese drei Seiten:
- Why syslet: wofür syslet gebaut ist
- Reconciliation model: wie syslet Soll- und Istzustand abgleicht
- Secret encryption: wie die Secrets auf den Host kommen
Weiterlesen¶
- CUE lesen: so viel CUE, wie man für unsere Dateien braucht
- syslet in diesem Repo: unsere Konventionen rund um syslet
- Eine Stack-Datei lesen: eine echte Stack-Datei Block für Block
- Verwaltung mit desync
- Terraform
- Arbeitsrechner einrichten