Table of Contents

nix-infra

Neben einem Ansible Repo durch welches manche Hosts konfiguriert werden, haben wir auch ein nix-infra Repo durch welches andere Hosts konfiguriert werden.

In diesem Repo ist Nix Konfiguration zu finden, um sowohl VM Templates für Proxmox zu erstellen, als auch um Hosts mit Hilfe von Colmena zu konfigurieren.

Hosts Deployment

Wir deployen Nix Hosts mit Hilfe von Colmena.

Jeder Host ist zu erst einmal in der flake.nix definiert, was dann für einen Host zum Beispiel so aussieht:

public-reverse-proxy = {
  deployment = {
    targetHost = "public-reverse-proxy.z9.ccchh.net";
    targetPort = 22;
    targetUser = "colmena-deploy";
    tags = [ "thinkcccluster" ];
  };
  imports = [ 
    ./config/common
    ./config/proxmox-vm
    ./config/hosts/public-reverse-proxy
  ];
};

Die deployment Optionen hier sind für Colmena direkt relevant. Sie beschreiben, wie sich zum Host connected werden soll und zu welchen Tags dieser zugehörig ist.

Das imports Statement ist das eigentlich für die System-Konfiguration relevante Statement. Es gibt an, welche Konfigurations-Dateien für die Konfiguration des Hosts genutzt werden sollen.

Um einen bzw. mehrere Hosts dann zu deployen, kann colmena apply genutzt werden:

Secrets

Für manche Hosts werden auch Secrets benötigt. Diese können wir nicht einfach in die Konfiguration mit inkludieren, da diese dann im Nix Store landen würden, welcher publicly readable ist.

Zum Glück bietet Colmena an dieser Stelle eine Lösung mit deployment.keys (siehe auch die Colmena Doku zu Secrets). Dies ist auch eine Option, welche wir direkt in unserer Konfiguration mit inkludieren, allerdings kümmert sich dann Colmena um das Secret Deployment und die Secrets landen nicht im Nix Store.

deployment.keys braucht auch wiederum eine Quelle für die Secrets. Hier nutzen wir dann wiederum unser Passwörter-Repository.

Eine Konfiguration für ein Secret sieht dann z.B. so aus:

deployment.keys."netbox-secret-key.secret" = {
  keyCommand = [ "pass" "noc/vm-secrets/z9/netbox/netbox_secret_key" ];

  destDir = "/secrets";
  user = "netbox";
  group = "netbox";
  permissions = "0440";

  uploadAt = "pre-activation";
};

Das Secret ist dann auf dem Host unter /secrets/netbox-secret-key.secret verfügbar, gehört dem netbox User und der netbox Group mit 0440 Permissions.

Nix Services haben für Optionen, die Secrets entgegennehmen, dann oft eine Möglichkeit ein Pfad anzugeben. So sieht das dann für das Beispiel-Secret und Netbox wie folgt aus:

services.netbox = {
  enable = true;
  secretKeyFile = "/secrets/netbox-secret-key.secret";
  # Weitere Konfiguration.
};

Hosts

Folgende Hosts werden via nix-infra gemanaged: