# Dockerized Puppet Master (OpenVox) Dieses Projekt konfiguriert einen Puppet Master, der in Docker-Containern läuft. Es verwendet Docker Compose für die Orchestrierung der Dienste, einschließlich des Puppet Masters (`openvox`), einer PostgreSQL-Datenbank und anderer notwendiger Komponenten. Die Konfiguration wurde optimiert, um portabel und einfach auf neuen Servern ausrollbar zu sein. ## Inhaltsverzeichnis - [Verzeichnisstruktur](#verzeichnisstruktur) - [Lokale Inbetriebnahme](#lokale-inbetriebnahme) - [Neuen Puppet-Agenten verbinden](#neuen-puppet-agenten-verbinden) - [Deployment mit Ansible](#deployment-mit-ansible) - [Backup & Portabilität](#backup--portabilität) --- ## Verzeichnisstruktur - `docker-compose.yml`: Die zentrale Datei, die alle Docker-Services, Volumes und Netzwerke definiert. - `.env.example`: Eine Vorlagedatei, die zeigt, welche Umgebungsvariablen (z.B. Passwörter) in einer `.env`-Datei benötigt werden. - `.gitignore`: Definiert Dateien und Verzeichnisse, die von Git ignoriert werden sollen (z.B. `ca_data/`, `.env`). - `code/`: Enthält den Puppet-Code (Manifeste, Module etc.), der von den Agenten angewendet wird. - `config/`: Beinhaltet Konfigurationsdateien für die verschiedenen Dienste. - `ca_data/`: **Wichtiges Verzeichnis.** Dies ist ein persistenter Speicher für die Certificate Authority (CA) des Puppet Masters. Es enthält alle signierten Zertifikate und wird per "bind mount" eingebunden. - `hiera_config.md`: Erklärt die Konfiguration von Hiera, dem Key-Value-Lookup-System von Puppet, das hier zur Klassenzuweisung verwendet wird. - `openvox_bugs.md`: Dokumentiert häufige SSL-Fehler und deren Lösungen. - `deploy_openvox.yml`: Ein Ansible-Playbook, um das gesamte Setup automatisiert auf einem neuen Server zu deployen. --- ## Lokale Inbetriebnahme Um das Projekt auf einem neuen Rechner (mit installiertem Docker und Docker Compose) zum ersten Mal zu starten: 1. **Projektverzeichnis klonen/kopieren:** Stellen Sie sicher, dass Sie das gesamte Projektverzeichnis auf dem neuen Host haben. 2. **`.env`-Datei erstellen:** Kopieren Sie die Vorlagedatei und tragen Sie Ihr sicheres Passwort ein. ```bash cp .env.example .env # Bearbeiten Sie nun die .env-Datei und setzen Sie das Passwort. ``` 3. **CA-Verzeichnis erstellen und Berechtigungen setzen (Der "CA-Fehler")** Der Puppet-Server im Container läuft aus Sicherheitsgründen nicht als `root`, sondern als Benutzer `puppet` mit der User-ID (UID) `999`. Wenn Docker ein Verzeichnis für einen "bind mount" verwendet, gehört dieses standardmäßig `root`. Dies führt zu einem "Permission denied"-Fehler, da der `puppet`-Benutzer nicht in das `root`-eigene Verzeichnis schreiben kann. Um dies zu beheben, müssen wir das `ca_data`-Verzeichnis manuell erstellen und ihm die korrekten Berechtigungen geben, *bevor* der Container gestartet wird. Führen Sie diese Befehle im Hauptverzeichnis des Projekts aus: ```bash # Verzeichnis für die CA-Daten erstellen sudo mkdir -p ./ca_data # Korrekte Berechtigungen für den 'puppet'-Benutzer (UID 999) setzen sudo chown -R 999:999 ./ca_data ``` 4. **Services starten:** Starten Sie alle Dienste mit Docker Compose. Die `.env`-Datei wird automatisch gelesen. ```bash docker compose up -d ``` 5. **Status überprüfen:** Nach etwa einer Minute sollte der `openvox`-Container als `healthy` angezeigt werden. ```bash docker compose ps ``` --- ## Neuen Puppet-Agenten verbinden Wenn ein neuer Puppet-Agent mit dem Master verbunden werden soll, muss sein Zertifikat signiert werden: 1. **Auf dem neuen Agenten:** Führen Sie den Agenten einmal aus. Er wird eine Zertifikatsanfrage (CSR) an den Master senden und mit einem Fehler abbrechen. ```bash sudo puppet agent -t ``` 2. **Auf dem Docker-Host (Master):** Listen Sie die ausstehenden Anfragen auf und signieren Sie die des neuen Agenten. ```bash # Anfragen auflisten docker exec -it openvox puppetserver ca list # Anfrage signieren (ersetzen Sie ) docker exec -it openvox puppetserver ca sign --certname ``` 3. **Erneut auf dem Agenten:** Führen Sie den Agenten erneut aus. Er sollte nun das signierte Zertifikat erhalten und seine Konfiguration anwenden. ```bash sudo puppet agent -t ``` *Bei SSL-Problemen siehe `openvox_bugs.md`.* --- ## Deployment mit Ansible Das beiliegende Ansible-Playbook `deploy_openvox.yml` automatisiert die Inbetriebnahme auf einem neuen Server. **Voraussetzungen:** - Auf dem **Steuer-Rechner**: Ansible und die `community.docker`-Collection. - Auf dem **Ziel-Server**: Docker und Docker Compose müssen bereits installiert sein. Passwortloser SSH-Zugang vom Steuer-Rechner zum Ziel-Server (z.B. via SSH-Key). **Ausführung:** 1. **Playbook verschieben:** Das Playbook ist so geschrieben, dass es den `openvox`-Ordner als Unterverzeichnis erwartet. Verschieben Sie `deploy_openvox.yml` eine Ebene nach oben: ```bash # Im Verzeichnis /home/jonnybravo/.docker/openvox/ ausführen mv deploy_openvox.yml ../ ``` 2. **Voraussetzungen installieren (Steuer-Rechner):** ```bash ansible-galaxy collection install community.docker ``` 3. **Inventory erstellen (Steuer-Rechner):** Erstellen Sie eine Datei `inventory.ini` im selben Verzeichnis wie das Playbook (`/home/jonnybravo/.docker/`). Passen Sie IP und Benutzer an. *Beispiel `inventory.ini`:* ```ini [puppet_masters] server1 ansible_host=192.168.1.100 ansible_user=jonnybravo ``` 4. **Playbook starten (Steuer-Rechner):** Führen Sie das Playbook vom Verzeichnis `/home/jonnybravo/.docker/` aus. Übergeben Sie den Namen der Ziel-Gruppe (`puppet_masters`) an die Variable `target_host`. ```bash ansible-playbook -i inventory.ini deploy_openvox.yml -e "target_host=puppet_masters" ``` Das Playbook kopiert den `openvox`-Ordner nach `/opt/openvox` auf dem Zielserver, setzt die Berechtigungen und startet die Container. --- ## Backup & Portabilität Durch die Verwendung eines "bind mounts" für das `ca_data`-Verzeichnis ist das Projekt hochgradig portabel und einfach zu sichern. - **Backup:** Um ein vollständiges Backup zu erstellen, sichern Sie einfach den gesamten `openvox`-Projektordner. Alle wichtigen Daten (Puppet-Code, CA-Zertifikate) sind darin enthalten. - **Wiederherstellung/Umzug:** Kopieren Sie den gesicherten Ordner auf einen neuen Server, führen Sie die Schritte unter [Lokale Inbetriebnahme](#lokale-inbetriebnahme) aus, und Ihr Puppet-Master ist mit allen signierten Zertifikaten wieder online.