diff --git a/README.md b/README.md index 07e8a40..b4ada0e 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ Die Konfiguration wurde optimiert, um portabel und einfach auf neuen Servern aus ## Inhaltsverzeichnis - [Verzeichnisstruktur](#verzeichnisstruktur) -- [Lokale Inbetriebnahme](#lokale-inbetriebnahme) +- [Manuelle Inbetriebnahme](#manuelle-inbetriebnahme) +- [Automatisierte Inbetriebnahme mit Ansible](#automatisierte-inbetriebnahme-mit-ansible) - [Neuen Puppet-Agenten verbinden](#neuen-puppet-agenten-verbinden) -- [Deployment mit Ansible](#deployment-mit-ansible) - [Backup & Portabilität](#backup--portabilität) --- @@ -24,13 +24,13 @@ Die Konfiguration wurde optimiert, um portabel und einfach auf neuen Servern aus - `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. +- `deploy_openvox.yml`: Ein Ansible-Playbook, um das lokale Setup zu automatisieren. --- -## Lokale Inbetriebnahme +## Manuelle Inbetriebnahme -Um das Projekt auf einem neuen Rechner (mit installiertem Docker und Docker Compose) zum ersten Mal zu starten: +Um das Projekt auf einem neuen Rechner (mit installiertem Docker und Docker Compose) zum ersten Mal manuell zu starten: 1. **Projektverzeichnis klonen/kopieren:** Stellen Sie sicher, dass Sie das gesamte Projektverzeichnis auf dem neuen Host haben. @@ -43,21 +43,16 @@ Um das Projekt auf einem neuen Rechner (mit installiertem Docker und Docker Comp ``` 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. + 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. 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 + # Im Hauptverzeichnis des Projekts ausführen: 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 ``` @@ -70,42 +65,15 @@ Um das Projekt auf einem neuen Rechner (mit installiertem Docker und Docker Comp --- -## Neuen Puppet-Agenten verbinden +## Automatisierte Inbetriebnahme mit Ansible -Wenn ein neuer Puppet-Agent mit dem Master verbunden werden soll, muss sein Zertifikat signiert werden: +Das beiliegende Ansible-Playbook `deploy_openvox.yml` automatisiert die Schritte der manuellen Inbetriebnahme auf Ihrem lokalen Rechner. -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. +### Lokale Ausführung (Standard) **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). +- Ansible und die `community.docker`-Collection (`ansible-galaxy collection install community.docker`) müssen auf Ihrem lokalen Rechner installiert sein. +- Docker und Docker Compose müssen installiert sein. **Ausführung:** @@ -116,24 +84,43 @@ Das beiliegende Ansible-Playbook `deploy_openvox.yml` automatisiert die Inbetrie mv deploy_openvox.yml ../ ``` -2. **Voraussetzungen installieren (Steuer-Rechner):** +2. **`.env`-Datei erstellen:** + Stellen Sie sicher, dass die `.env`-Datei mit dem Passwort existiert, wie im manuellen Setup beschrieben. + +3. **Playbook starten:** + Führen Sie das Playbook vom übergeordneten Verzeichnis aus (`/home/jonnybravo/.docker/`). Es führt die `mkdir`-, `chown`- und `docker compose up`-Schritte für Sie aus. ```bash - ansible-galaxy collection install community.docker + ansible-playbook deploy_openvox.yml ``` -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 - ``` +### Option: Remote-Deployment + +Obwohl das Playbook für den lokalen Gebrauch optimiert ist, kann es als Vorlage für ein Remote-Deployment dienen. Dazu müssten Sie es anpassen, um: +1. Eine `hosts`-Variable anstelle von `localhost` zu verwenden. +2. Einen `copy`-Task hinzuzufügen, der das Projektverzeichnis auf den Zielserver kopiert. +3. Sicherzustellen, dass die Pfadvariablen (`project_path`) für den Remote-Kontext korrekt sind. + +--- + +## Neuen Puppet-Agenten verbinden + +Unabhängig von der Installationsmethode ist der Prozess zum Verbinden eines neuen Agenten immer gleich: + +1. **Auf dem neuen Agenten:** `sudo puppet agent -t` (wird fehlschlagen) +2. **Auf dem Docker-Host (Master):** `docker exec -it openvox puppetserver ca sign --certname ` +3. **Erneut auf dem Agenten:** `sudo puppet agent -t` (sollte erfolgreich sein) + +*Bei SSL-Problemen siehe `openvox_bugs.md`.* + +--- + +## 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:** Sichern Sie einfach den gesamten `openvox`-Projektordner. Alle wichtigen Daten (Puppet-Code, CA-Zertifikate, `.env`-Datei) sind darin enthalten. +- **Wiederherstellung/Umzug:** Kopieren Sie den Ordner auf einen neuen Server, führen Sie die Schritte unter [Manuelle Inbetriebnahme](#manuelle-inbetriebnahme) oder [Automatisierte Inbetriebnahme mit Ansible](#automatisierte-inbetriebnahme-mit-ansible) aus, und Ihr Puppet-Master ist mit allen signierten Zertifikaten wieder online. -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. --- diff --git a/deploy_openvox.yml b/deploy_openvox.yml index 9e814ea..686d6f5 100644 --- a/deploy_openvox.yml +++ b/deploy_openvox.yml @@ -1,42 +1,30 @@ --- -- name: Deploy OpenVox Docker Compose Project - hosts: "{{ target_host | default('localhost') }}" +- name: Setup OpenVox Docker Project on Localhost + hosts: localhost + connection: local become: true vars: - project_dir_name: "openvox" - # ANNAHME: Das Playbook wird aus dem übergeordneten Verzeichnis von 'openvox' ausgeführt. - # Passen Sie ggf. den Pfad an. - project_local_path: "{{ playbook_dir }}/{{ project_dir_name }}" - project_remote_path: "/opt/{{ project_dir_name }}" + # Annahme: Das Playbook wird aus dem übergeordneten Verzeichnis von 'openvox' ausgeführt. + project_path: "{{ playbook_dir }}/openvox" tasks: - - name: "Stellt sicher, dass das Projektverzeichnis auf dem Zielhost existiert" - ansible.builtin.file: - path: "{{ project_remote_path }}" - state: directory - mode: '0755' - - - name: "Kopiert die Projektdateien auf den Zielhost" - ansible.builtin.copy: - src: "{{ project_local_path }}/" - dest: "{{ project_remote_path }}/" - - name: "Stellt sicher, dass das ca_data Verzeichnis existiert" ansible.builtin.file: - path: "{{ project_remote_path }}/ca_data" + path: "{{ project_path }}/ca_data" state: directory mode: '0755' - name: "Setzt die Berechtigungen für das ca_data Verzeichnis" ansible.builtin.file: - path: "{{ project_remote_path }}/ca_data" + path: "{{ project_path }}/ca_data" owner: '999' group: '999' recurse: true + notify: Restart docker compose - name: "Startet die Docker Compose Services" community.docker.docker_compose_v2: - project_src: "{{ project_remote_path }}" + project_src: "{{ project_path }}" state: present # 'present' entspricht 'up -d' register: compose_output @@ -44,4 +32,11 @@ ansible.builtin.debug: var: compose_output + handlers: + - name: Restart docker compose + community.docker.docker_compose_v2: + project_src: "{{ project_path }}" + state: present + restarted: true +