GNAI-007: Ansible Rolle zum Installieren von Podman hinzugefügt.

This commit is contained in:
2026-09-20 00:15:28 +02:00
parent de06eb6129
commit 2a2bd2326d
8 changed files with 227 additions and 22 deletions
+4 -4
View File
@@ -2,7 +2,7 @@
Dokumentation für die Infrastruktur eines privaten Homelabs mit öffentlich erreichbaren Webdiensten, einem WireGuard-Zugang und einem dedizierten KI-Server. Dieses Repository hält Architekturentscheidungen, den belegten Betriebsstand und Verfahren für Einrichtung, Betrieb und Sicherheitsabnahme fest.
> **Projektstand: 19.09.2026.** Die Dokumentationsrevisionen sind zusammengeführt. Mehrere Sicherheitsmaßnahmen und technische Abnahmen stehen noch aus. Der KI-Server ist derzeit ein frisch eingerichtetes Basissystem; sein LLM-Anwendungsstack soll in einem späteren Sprint mit Ansible installiert werden.
> **Projektstand: 20.09.2026.** Die Dokumentationsrevisionen sind zusammengeführt. Mehrere Sicherheitsmaßnahmen und technische Endabnahmen stehen noch aus. Auf dem KI-Server sind die gemeinsame Host-Baseline und Podman eingerichtet; der LLM-Anwendungsstack ist noch nicht installiert.
## Überblick
@@ -26,7 +26,7 @@ Die drei vorgesehenen VPN-Netzwerkrollen sind **Familie** (gesamtes Heimnetz), *
| Bereich | Belegter Stand | Nächster Nachweis oder Schritt |
| --- | --- | --- |
| KI-Server | Debian-Basissystem, lesender Preflight, verifizierter `ansible-deploy`-Account und idempotent angewendete minimale Host-Baseline | Podman-Runtime als nächste getrennte Rolle planen und kontrolliert abnehmen |
| KI-Server | Debian-Basissystem, verifizierter Deployment-Zugang, minimale Host-Baseline und Podman 5.4.2 mit geprüftem Quadlet-Generator | Ausführungsmodell und Service-Accounts für Production und Testing festlegen; danach GPU-Laufzeit prüfen |
| VPN | wg-easy v15.4.0 auf CT 105 aktiv; ein externer Laptop-Teiltest liegt vor | Rollenrechte serverseitig umsetzen und mit erlaubten sowie gesperrten Zielen testen |
| Reverse Proxy | NPM auf CT 103 dokumentiert; Fail2Ban laut Betreiber fest gepinnt und wieder in Betrieb | Effektive Jails, Sperren und Wiederanlauf prüfen |
| Identität | Keycloak/OIDC laut Betreiber produktiv für Vaultwarden | Öffentlich erreichbare Keycloak-Administration sperren und den OIDC-Login erneut prüfen |
@@ -47,11 +47,11 @@ Der [Dokumentationsindex](docs/GNAI-000-DOC_Index.md) enthält die datierten Que
| [Windows 11](docs/GNAI-006-SEC_VPN_Clients_Windows11.md) und [Linux](docs/GNAI-006-SEC_VPN_Clients_Linux.md) | Einrichtung und Nutzung auf Endgeräten |
| [WireGuard-Implementation-Log](docs/GNAI-006-SEC_VPN_Implementation-Log.md) | Historie, Tests und Korrekturen früherer Befunde |
| [Ansible-Deployment-Planung](docs/GNAI-007-PLAN_Ansible-Deployment.md) | nicht finaler Arbeitsentwurf zur reproduzierbaren Bereitstellung, Gitea-Integration und geplanten Folgedokumentation |
| [Ansible-Control-Projekt](ansible/README.md) | lokale Einrichtung, lesender Server-Preflight, Deployment-Account und gemeinsame Host-Baseline |
| [Ansible-Control-Projekt](ansible/README.md) | lokale Einrichtung, Preflight, Deployment-Account, Host-Baseline und Podman-Runtime |
## Arbeiten mit dem Repository
Dieses Repository enthält Dokumentation und ein Ansible-Control-Projekt. Es prüft Inventar, SSH-Zugang, Hostidentität, Betriebssystem und die dokumentierten GPUs. Eine erste gemeinsame Rolle verwaltet ausschließlich die Konfigurations- und Datenwurzeln für Production und Testing; der KI-Anwendungsstack ist noch nicht bereitgestellt. Vor einer Infrastrukturänderung den Ist-Stand am betroffenen Host prüfen, die passende Fachanleitung lesen und die dort genannten Abnahmeschritte dokumentieren.
Dieses Repository enthält Dokumentation und ein Ansible-Control-Projekt. Es prüft Inventar, SSH-Zugang, Hostidentität, Betriebssystem und die dokumentierten GPUs. Gemeinsame Rollen verwalten die Konfigurations- und Datenwurzeln sowie Podman und Quadlet. Images, Container und der KI-Anwendungsstack sind noch nicht bereitgestellt. Vor einer Infrastrukturänderung den Ist-Stand am betroffenen Host prüfen, die passende Fachanleitung lesen und die dort genannten Abnahmeschritte dokumentieren.
WireGuard-Profile enthalten private Schlüssel. Sie gehören nicht in Git, Ausgaben oder freigegebene Dokumente. Das lokale Verzeichnis `docs/GNAI-006-profiles/` schließt Profil-Dateien über eine eigene `.gitignore` aus; es ist kein Verteiler- oder Backup-Ort für Zugangsdaten.
+13
View File
@@ -138,3 +138,16 @@ inventory and supply the private deployment key outside the repository:
Run the final command a second time. The second recap must report `changed=0`
and `failed=0`; otherwise the role has not demonstrated convergence.
## Podman runtime
The shared host play also installs the Podman runtime from Debian 13. The role
requires systemd and cgroup v2, prepares `/etc/containers/systemd`, verifies the
overlay storage driver and exercises the installed Quadlet generator without
creating a workload.
The role explicitly keeps the Podman API socket and automatic image-update
timer disabled. It pulls no image and does not yet choose rootful or rootless
execution for the two environments. Apply and check it through the same
`playbooks/host.yml` commands shown above. The first run may install packages;
an immediate second run must report `changed=0`.
+1
View File
@@ -10,3 +10,4 @@
roles:
- role: host_baseline
- role: podman_runtime
+20
View File
@@ -0,0 +1,20 @@
# Podman runtime
The `podman_runtime` role installs and verifies the shared container runtime on
`ghostnet-ki`.
The initial scope is intentionally limited:
- install Podman from Debian 13 together with DNS and rootless-network helpers;
- require systemd and cgroup v2;
- create `/etc/containers/systemd` for future system Quadlets;
- keep the Podman API socket and automatic image-update timer disabled;
- verify Podman version, cgroup mode, the overlay storage driver and the
executable Quadlet generator; and
- run the Quadlet generator in dry-run mode without defining a workload.
The role does not pull images or create Production and Testing containers. It
also does not yet
choose between rootful system Quadlets and separate rootless service accounts.
That decision belongs to the environment design because it affects GPU access,
filesystem ownership and deployment privileges.
@@ -0,0 +1,15 @@
---
podman_runtime_packages:
- podman
- aardvark-dns
- passt
- slirp4netns
- uidmap
podman_runtime_minimum_major_version: 5
podman_runtime_quadlet_directory: /etc/containers/systemd
podman_runtime_generator_path: /usr/lib/systemd/system-generators/podman-system-generator
podman_runtime_disabled_units:
- podman.socket
- podman-auto-update.timer
+126
View File
@@ -0,0 +1,126 @@
---
- name: Verify the supported operating system and init system
ansible.builtin.assert:
that:
- ansible_facts["distribution"] == "Debian"
- ansible_facts["distribution_major_version"] == "13"
- ansible_facts["service_mgr"] == "systemd"
fail_msg: >-
The Podman runtime role currently supports only Debian 13 with systemd.
- name: Read the host cgroup filesystem type
ansible.builtin.command:
argv:
- /usr/bin/stat
- -fc
- "%T"
- /sys/fs/cgroup
check_mode: false
changed_when: false
register: podman_runtime_cgroup_filesystem
- name: Require cgroup v2 before installing Podman
ansible.builtin.assert:
that:
- podman_runtime_cgroup_filesystem.stdout == "cgroup2fs"
fail_msg: >-
Podman Quadlet requires cgroup v2, but /sys/fs/cgroup is not cgroup2fs.
- name: Install the Podman runtime and rootless networking prerequisites
ansible.builtin.apt:
name: "{{ podman_runtime_packages }}"
state: present
update_cache: true
cache_valid_time: 3600
install_recommends: false
- name: Create the system Quadlet directory
ansible.builtin.file:
path: "{{ podman_runtime_quadlet_directory }}"
state: directory
owner: root
group: root
mode: "0755"
- name: Keep the Podman API and automatic image updates disabled
ansible.builtin.systemd_service:
name: "{{ item }}"
enabled: false
state: stopped
loop: "{{ podman_runtime_disabled_units }}"
when: not ansible_check_mode
- name: Inspect the installed Quadlet generator
ansible.builtin.stat:
path: "{{ podman_runtime_generator_path }}"
follow: true
register: podman_runtime_generator
when: not ansible_check_mode
- name: Verify the installed Quadlet generator
ansible.builtin.assert:
that:
- podman_runtime_generator.stat.exists
- podman_runtime_generator.stat.isreg
- podman_runtime_generator.stat.executable
fail_msg: The Podman system generator is missing or not executable.
when: not ansible_check_mode
- name: Read Podman runtime information
ansible.builtin.command:
argv:
- /usr/bin/podman
- info
- --format=json
changed_when: false
register: podman_runtime_info_command
when: not ansible_check_mode
- name: Read the installed Podman version
ansible.builtin.command:
argv:
- /usr/bin/podman
- version
- --format=json
changed_when: false
register: podman_runtime_version_command
when: not ansible_check_mode
- name: Parse Podman runtime information
ansible.builtin.set_fact:
podman_runtime_info: "{{ podman_runtime_info_command.stdout | from_json }}"
podman_runtime_version: "{{ podman_runtime_version_command.stdout | from_json }}"
when: not ansible_check_mode
- name: Verify the Podman runtime
ansible.builtin.assert:
that:
- >-
podman_runtime_version["Client"]["Version"].split(".")[0] | int >=
podman_runtime_minimum_major_version | int
- podman_runtime_info["host"]["cgroupVersion"] == "v2"
- podman_runtime_info["store"]["graphDriverName"] == "overlay"
fail_msg: >-
Podman is installed, but its version, cgroup mode or storage driver does
not match the declared runtime baseline.
when: not ansible_check_mode
- name: Exercise the Quadlet generator without defining a workload
ansible.builtin.command:
argv:
- "{{ podman_runtime_generator_path }}"
- --dryrun
environment:
QUADLET_UNIT_DIRS: "{{ podman_runtime_quadlet_directory }}"
changed_when: false
when: not ansible_check_mode
- name: Report the verified Podman runtime
ansible.builtin.debug:
msg:
version: "{{ podman_runtime_version['Client']['Version'] }}"
cgroup_version: "{{ podman_runtime_info['host']['cgroupVersion'] }}"
storage_driver: "{{ podman_runtime_info['store']['graphDriverName'] }}"
quadlet_generator: "{{ podman_runtime_generator_path }}"
disabled_units: "{{ podman_runtime_disabled_units }}"
when: not ansible_check_mode
+8 -4
View File
@@ -1,6 +1,6 @@
# Ghostnet.AI – Dokumentationsindex und Projektstand
**Stand:** 2026-09-19
**Stand:** 2026-09-20
**Status:** Revisionen zusammengeführt; Sicherheitsumsetzung und technische Endabnahme offen
## 1. Dokumente und Zielgruppen
@@ -18,7 +18,7 @@
| [GNAI-006-SEC_VPN_Clients_Linux.md](GNAI-006-SEC_VPN_Clients_Linux.md) | Debian, Arch/CachyOS, Fedora/Kinoite; Junior IT |
| [GNAI-006-SEC_VPN_Implementation-Log.md](GNAI-006-SEC_VPN_Implementation-Log.md) | historische v14/v15-Umsetzung und Evidenzkorrekturen; Intermediate IT |
| [GNAI-007-PLAN_Ansible-Deployment.md](GNAI-007-PLAN_Ansible-Deployment.md) | nicht finaler Arbeitsentwurf zum Ansible-/Gitea-Deployment und zur geplanten Folgedokumentation; Infrastrukturadministratoren und Mitwirkende |
| [Ansible-Control-Projekt](../ansible/README.md) | Control-Node, Preflight, Deployment-Account und gemeinsame Host-Baseline; Intermediate IT |
| [Ansible-Control-Projekt](../ansible/README.md) | Control-Node, Preflight, Deployment-Account, Host-Baseline und Podman-Runtime; Intermediate IT |
## 2. Verbindliche, bestätigte Entscheidungen
@@ -32,9 +32,9 @@ Der KI-Server heißt laut lesendem SSH-Abgleich vom 18.09.2026 `ghostnet-ki`; di
Die getrennten Schlüsselzugänge für `ghost` und `ghost-agent` wurden am 19.09.2026 erfolgreich getestet. Der persönliche Login wurde vom Betreiber interaktiv bestätigt; der Agentenlogin wurde technisch gegen Benutzername und Hostname geprüft.
Der KI-Server ist laut Betreiber frisch eingerichtet. Die LLM-Anwendungen sollen erst in einem späteren Sprint mit Ansible installiert werden. Bis dahin beschreiben GNAI-003 und GNAI-004 für diesen Host ein Zielbild; der lesende SSH-Abgleich betraf nur Basisbetrieb und Zugänge.
Der KI-Server wurde als frisches Debian-Basissystem begonnen. Inzwischen sind die dokumentierten Ansible-Zugänge, die minimale Host-Baseline und Podman eingerichtet. Die LLM-Anwendungen sind weiterhin nicht installiert; GNAI-003 und GNAI-004 beschreiben für sie ein Zielbild.
Der [Ansible-Deployment-Entwurf](GNAI-007-PLAN_Ansible-Deployment.md) persistiert den Planungsstand vom 19.09.2026. Er ist ausdrücklich keine verbindliche Spezifikation und kein Nachweis einer eingerichteten Deploymentkette. Die dort genannten Runner-, Account-, Freigabe- und Secret-Verfahren sind bis zu ihrer Prüfung und formalen Übernahme vorläufig.
Der [Ansible-Deployment-Entwurf](GNAI-007-PLAN_Ansible-Deployment.md) persistiert den seit dem 19.09.2026 fortgeschriebenen Planungs- und Implementierungsstand. Er ist ausdrücklich keine verbindliche Spezifikation und kein Nachweis einer vollständig eingerichteten Deploymentkette. Die dort genannten Runner-, Freigabe- und Secret-Verfahren sind bis zu ihrer Prüfung und formalen Übernahme vorläufig.
Das erste Ansible-Control-Projekt mit Testing-Inventar und lesendem Preflight wurde am 19.09.2026 angelegt. Der Live-Lauf über `ghost-agent` bestätigte Hostidentität, Debian 13.6, IPv4-Adresse, Python, CPU, RAM und zwei Navi-21-Geräte mit `changed=0`, `unreachable=0` und `failed=0`. Dieser Nachweis umfasst weder privilegierten Zugriff noch eine eingerichtete Production-/Testing-Laufzeitumgebung.
@@ -42,6 +42,8 @@ Der separate Ed25519-Schlüssel mit Fingerprint `SHA256:IKEInbIo8VVI1USg5+a3ypGK
Die erste schreibende Rolle `host_baseline` wurde am 19.09.2026 nach erfolgreichem Syntax- und Check-Modus-Lauf angewendet. Sie prüft Hostname, Debian-Hauptversion, Standard-IPv4 sowie mindestens 100 GiB freien Speicher und verwaltet ausschließlich `/etc/ghostnet-ai/{production,testing}` und `/var/lib/ghostnet-ai/{production,testing,shared}` mit Root-Eigentum. Der erste reale Lauf meldete `ok=6 changed=1 unreachable=0 failed=0`; der unmittelbar folgende identische Lauf belegte Idempotenz mit `ok=6 changed=0 unreachable=0 failed=0`. Pakete, Dienste und Anwendungen wurden dabei nicht verändert.
Die Rolle `podman_runtime` wurde am 20.09.2026 angewendet. Sie installierte Podman 5.4.2 aus Debian 13 einschließlich expliziter DNS- und rootless Netzwerkvoraussetzungen, prüfte systemd, cgroup v2, Overlay-Storage und den Quadlet-Generator und legte `/etc/containers/systemd` an. `podman.socket` und `podman-auto-update.timer` werden deaktiviert und gestoppt gehalten. Der abschließende Gesamtlauf meldete `ok=20 changed=0 unreachable=0 failed=0`; eine getrennte Prüfung bestätigte leere Image- und Containerlisten sowie beide Units als `disabled` und `inactive`.
## 3. Sicherheitsbefunde mit Priorität
| Befund | dokumentiertes Verfahren / Status |
@@ -75,4 +77,6 @@ Beim anschließenden Bootstrap wurden Benutzer, Home-/SSH-Verzeichnisse, `author
Für die gemeinsame Host-Baseline bestätigte ein vorgelagerter Check-Modus genau sieben neu anzulegende Verzeichnisse und rund 1.677,7 GiB freien Platz auf `/`. Der anschließende reale Lauf legte die Verzeichniswurzeln an. Eine sofortige Wiederholung ergab `changed=0`; die Rolle konvergiert damit für ihren derzeitigen Umfang. Dieser Nachweis umfasst keine Paket-, Runtime-, GPU- oder Anwendungsinstallation.
Am 20.09.2026 sagte der Podman-Check-Modus 38 neue Debian-Pakete und das Quadlet-Verzeichnis voraus. Der reale Lauf installierte diese Pakete; seine erste Nachprüfung bewertete den Debian-Symlink des Quadlet-Generators irrtümlich nicht als reguläre Datei. Nach Korrektur der Ansible-`stat`-Prüfung auf das aufgelöste Ziel bestanden Podman 5.4.2, cgroup v2, Overlay-Storage und der Generator-Dry-Run. Der finale Gesamtlauf war mit `changed=0` idempotent. Es wurden weder Images geladen noch Container oder Anwendungsdienste angelegt.
Die WireGuard-Evidenz bleibt der Teiltest vom 12.09.2026: CachyOS-Laptop von WAN, Handshake, Ping auf Gateway/Proxmox und direkter IPv4-Internetpfad bestanden; KI-Server war ausgeschaltet. Neue Rollen, weitere Clientvarianten, Gateway-GUI-Zugriff, WAN-/IPv6-Isolation, Neustart und Restore sind noch nicht abgenommen. GNAI-006 ist erst nach Klärung der offenen Werte, Umsetzung und dokumentierter Abnahme technisch abgeschlossen.
+40 -14
View File
@@ -2,12 +2,13 @@
**Dokumenten-ID:** GNAI-007-PLAN
**Titel:** Ansible-Deployment für den KI-Server – Planungsstand
**Stand:** 2026-09-19
**Stand:** 2026-09-20
**Status:** Nicht finaler Arbeitsentwurf zur Persistierung des aktuellen Planungsstands
**Referenzen:** [Projektstand](GNAI-000-DOC_Index.md), [Zielarchitektur](GNAI-003-INFRA_Architecture.md), [Zugriffskonzept](GNAI-004-SEC_Access-Control.md)
> **Abgrenzung:** Dieses Dokument hält die Ergebnisse der Planungssession vom
> 19.09.2026 fest. Es ist weder eine freigegebene technische Spezifikation noch
> **Abgrenzung:** Dieses Dokument hält die Ergebnisse der am 19.09.2026
> begonnenen und am 20.09.2026 fortgeschriebenen Planungssession fest. Es ist
> weder eine freigegebene technische Spezifikation noch
> eine Installationsanleitung oder ein Nachweis über bereits umgesetzte
> Komponenten. Entscheidungen, die noch geprüft oder bestätigt werden müssen,
> sind ausdrücklich als vorläufig oder offen gekennzeichnet.
@@ -25,6 +26,7 @@
| 2026-09-19 | 0.5 | spektr / Codex | technischen Schlüssel sowie Bootstrap- und Prüfplaybook für `ansible-deploy` vorbereitet; Ausführung bleibt interaktiv offen |
| 2026-09-19 | 0.6 | spektr / Codex | `ansible-deploy` auf dem KI-Server eingerichtet und SSH-/sudo-Zugriff unabhängig erfolgreich verifiziert |
| 2026-09-19 | 0.7 | spektr / Codex | minimale gemeinsame Host-Baseline mit Schutzprüfungen und getrennten Verzeichniswurzeln implementiert, angewendet und auf Idempotenz geprüft |
| 2026-09-20 | 0.8 | spektr / Codex | gemeinsame Podman-/Quadlet-Runtime implementiert, installiert und ohne Images oder Container verifiziert |
---
@@ -65,11 +67,11 @@ aktuellen Plan nicht zum privilegierten Deployment-Account erweitert werden.
Das Repository enthält inzwischen ein minimales Ansible-Control-Projekt mit
Testing-Inventar, einem ausschließlich lesenden Preflight sowie Bootstrap- und
Prüfplaybooks für `ansible-deploy`. Der privilegierte Deployment-Account ist
eingerichtet und verifiziert. Eine erste schreibende Rolle verwaltet die
gemeinsamen Konfigurations- und Datenwurzeln des Hosts; Anwendungsrollen und ein
Production-Inventar existieren noch nicht. Der Preflight selbst nahm keine
Änderungen vor; Bootstrap und Host-Baseline blieben auf die nachfolgend
dokumentierten Zugangs- und Verzeichniszustände begrenzt.
eingerichtet und verifiziert. Schreibende Rollen verwalten die gemeinsamen
Konfigurations- und Datenwurzeln sowie Podman und Quadlet. Anwendungsrollen und
ein Production-Inventar existieren noch nicht. Der Preflight selbst nahm keine
Änderungen vor; die bislang angewendeten Rollen bleiben auf die nachfolgend
dokumentierten Zugangs-, Verzeichnis- und Runtime-Zustände begrenzt.
---
@@ -112,7 +114,7 @@ Planungsrichtung und noch nicht bestätigten Implementierungsdetails.
| Thema | Aktueller Planungsstand | Verbindlichkeit / Nachweis |
| --- | --- | --- |
| Konfigurationsmanagement | Ansible beschreibt Basissystem, Laufzeitumgebung, Dienste und Konfiguration | minimales Control-Projekt, lesender Preflight und angewendete erste `host_baseline` vorhanden; Runtime- und Anwendungsrollen fehlen noch |
| Konfigurationsmanagement | Ansible beschreibt Basissystem, Laufzeitumgebung, Dienste und Konfiguration | Control-Projekt, Preflight, `host_baseline` und `podman_runtime` vorhanden und angewendet; GPU- und Anwendungsrollen fehlen noch |
| Quell- und Freigabeverfahren | Änderungen über Gitea-Branches und Pull Requests; kein regulärer Direkt-Push auf `main` | vorgesehen; Branch-Schutz noch nicht geprüft oder eingerichtet |
| CI | Pull Requests erhalten Lint-, YAML- und Ansible-Syntaxprüfungen ohne produktive Zugangsdaten | vorgesehen; Workflow noch nicht vorhanden |
| Produktionsausführung | Gitea Actions startet Ansible über eine dedizierte Production-Berechtigungsstufe | bevorzugte Lösung; Gitea-Version, Runner-Trennung und Actions-Funktion noch zu prüfen |
@@ -532,7 +534,8 @@ nicht als Nachweis einer erfolgreichen Einrichtung.
### Phase D – KI-Laufzeit
- Podman und systemd-Integration;
- Podman- und Quadlet-Grundruntime eingerichtet und geprüft; konkretes
rootful/rootless Ausführungsmodell noch festzulegen;
- AMD-GPU-/ROCm- oder alternative Laufzeit nach technischer Prüfung;
- `llama.cpp` und lokaler Funktionstest;
- Wiederanlauf nach geplantem Reboot prüfen.
@@ -611,6 +614,8 @@ Herstellerdokumentationen herangezogen:
- [Ansible Playbooks](https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_intro.html)
- [Ansible Check- und Diff-Modus](https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_checkmode.html)
- [Ansible Vault](https://docs.ansible.com/projects/ansible/latest/vault_guide/vault.html)
- [Debian 13 – Paket `podman`](https://packages.debian.org/trixie/podman)
- [Podman – Quadlet und systemd](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html)
Vor der Implementierung sind versionsspezifische Aussagen gegen die dann
tatsächlich eingesetzten Gitea-, Runner- und Ansible-Versionen zu prüfen.
@@ -689,21 +694,42 @@ Lauf endete mit `ok=6 changed=0 unreachable=0 failed=0` und belegt die
Idempotenz des aktuellen Rollenumfangs. Es wurden keine Pakete installiert und
keine Dienste, Container oder GPU-Komponenten verändert.
Am 20.09.2026 wurde `podman_runtime` in das gemeinsame Host-Playbook
aufgenommen. Die Rolle installiert `podman`, `aardvark-dns`, `passt`,
`slirp4netns` und `uidmap` ohne empfohlene Build- und Checkpoint-Pakete. Sie
verlangt Debian 13, systemd und cgroup v2, verwaltet
`/etc/containers/systemd`, prüft mindestens Podman-Hauptversion 5 sowie den
Overlay-Storage und führt den Quadlet-Generator ohne Workload im Dry-Run aus.
Der API-Socket und der automatische Image-Update-Timer bleiben explizit
deaktiviert und gestoppt.
Der Check-Modus sagte 38 neue Pakete und das Quadlet-Verzeichnis voraus. Im
ersten realen Lauf wurden die Pakete installiert; die anschließende
Generatorprüfung schlug fehl, weil der Generator in Debian als Symlink
bereitgestellt wird und die `stat`-Prüfung das Ziel zunächst nicht auflöste.
Nach der Korrektur auf `follow: true` bestanden sämtliche Laufzeitprüfungen.
Der finale Gesamtlauf endete mit
`ok=20 changed=0 unreachable=0 failed=0`. Verifiziert wurden Podman 5.4.2,
cgroup v2, der Storage-Treiber `overlay` und der ausführbare Quadlet-Generator.
Eine getrennte Prüfung bestätigte außerdem leere Image- und Containerlisten
sowie `podman.socket` und `podman-auto-update.timer` jeweils als `disabled` und
`inactive`.
---
## 15. Abschlussgrenze dieses Entwurfs
Mit Version 0.7 sind der aktuelle Planungsstand, der ausdrücklich begrenzte
Mit Version 0.8 sind der aktuelle Planungsstand, der ausdrücklich begrenzte
Ansible-Preflight, der verifizierte Deployment-Account und die angewendete
minimale Host-Baseline persistiert.
minimale Host-Baseline sowie die Podman-/Quadlet-Grundruntime persistiert.
Insbesondere wurden noch nicht:
- ein Gitea Runner angelegt,
- Gitea Actions oder Schutzregeln konfiguriert,
- Runtime- oder Anwendungsrollen, ein Production-Inventar oder ein Vault erstellt,
- GPU- oder Anwendungsrollen, ein Production-Inventar oder ein Vault erstellt,
- eine Production- oder Testing-Umgebung eingerichtet oder voneinander
abgenommen,
- Pakete oder Anwendungen auf dem KI-Server installiert,
- GPU-Komponenten oder Anwendungen auf dem KI-Server installiert,
- Backups oder Rollbacks praktisch getestet oder
- die geplante Deploymentkette technisch abgenommen.