Zum Inhalt

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 fmt eine 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:

  1. Why syslet: wofür syslet gebaut ist
  2. Reconciliation model: wie syslet Soll- und Istzustand abgleicht
  3. Secret encryption: wie die Secrets auf den Host kommen

Weiterlesen