- workload_accounts: gn-media (GID 970), gn-download (983), gn-dashboard (984); gn-media als primäre Gruppe der Pipeline-Konten — AUTH_SYS ueber NFSv4 wirkte serverseitig nicht mit Supplementary-Gruppen (Betriebsbefund 30.10.2026); Sudoers des Deploy-Kontos auf (ALL:ALL) verbreitert (become_user) - video_encoding: NFS-Client, Mount-Unit und Pipeline-Layout auf dem Export (10.0.0.2:/media/datenhdd3/Encoding -> /var/lib/ghostnet-pipeline, ausserhalb der Homes); Layout-Anlage als Dienstkonten wegen root_squash; Verifikation der Verzeichnisrechte als gn-encoding (2777/2770/0750/2750, Gruppe 970) - pve_media_cron: Legacy-Crontab (chown root:root + chmod -R 0777 auf allen Medienplatten, alle 10 min) entfernt — haette jedes echte Berechtigungsmodell plattgewalzt; Backup unter /var/backups/ghostnet/pve/; verify-production prueft das Fehlen ab - verify-pipeline-handover.yml: Handover-Simulation über alle Identitaeten (CT-101-.dlc-Drop -> gn-download -> queue -> gn-encoding -> output/state -> gn-dashboard); einmal vollstaendig bestanden (30.10.2026) - Doku: GNENC-000/001/002, GNAI-017 (6.10/6.11), GNMON-001 auf Stand gebracht Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
PVE-Host (10.0.0.2) — Ansible-Verwaltung
Projekt zur deklarativen Verwaltung des Proxmox-VE-Hosts selbst
(pve, 10.0.0.2). Bis 2026-10-30 liefen Host-Änderungen als manuelle
Root-Skripte auf der Konsole; seit der NFS-Umstellung (GNAI-019 Entscheidung 2,
revidiert) wird persistente Host-State über dieses Ansible-Projekt gepflegt —
reproduzierbar und versioniert im Repo. GNAI-011 §1 sieht ein eigenes
Host-Verfahren vor („Proxmox-Hostzugang … benötigen ein eigenes, späteres
Verfahren“); dieses Projekt ist der Anfang davon. Die SSH-Härtung des Hosts
selbst bleibt davon unberührt (GNAI-011 gilt nur für die LXCs) und ist ein
eigenes, späteres Vorhaben.
Aktuell verwaltete Host-State:
- Kernel-NFS-Export
/media/datenhdd3/Encoding→ghostnet-ki(10.0.0.90/32), NFSv4-only — Rollepve_nfs_export(Ersatz für das frühere manuelle Script; CT 101 kann NFS nicht selbst serve, siehe GNAI-019). - Legacy-Medien-Cron entfernt: Die root-Crontab-Einträge
(
chown -R root:root/chmod -R 0777auf allen Medien-Mounts, alle 10 Minuten, installiert 2026-10-11) sind entfernt — Rollepve_media_cron(Betreiberentscheidung 30.10.2026; Backup unter/var/backups/ghostnet/pve/). Der Cron hätte jedes echte Berechtigungsmodell unter den Medien-Mounts — inklusive der Encoding-Pipeline — alle 10 Minuten plattgewalzt. - LXC-Configs: Entfernen der Ganesha-Ära-
lxc.seccomp.profile:-Leerzeile aus/etc/pve/lxc/101.conf— Rollepve_lxc_conf(wirksam beim nächsten CT-Start/Reboot).
Die CT-Lebenszyklus-Skripte (proxmox/lxc/<ct>/scripts/: pct create,
Dist-Upgrade) bleiben Bootstrap-Skripte und laufen einmalig manuell als
root@pve — sie erzeugen die CTs, bevor Ansible sie erreichen kann.
Zugang: dedizierter Deploy-Account auf dem Host
Muster wie auf den LXCs/ghostnet-ki: eigener Account, gelocktes Passwort,
passphrase-loser Ed25519-Key mit Source-Restrictions, NOPASSWD-Sudoers. Der
Key ist root-äquivalent — nur der public Key liegt im Repo
(ansible/files/ssh/pve-ansible-deploy.pub), der private Key nur in ~/.ssh
(mode 0600).
Einmalig auf der PVE-Konsole (root@pve) ausführen:
# freie UID >= 1000 wählen, z.B. 1000:
getent passwd | awk -F: '$3>=1000 {print $1, $3}' | sort -k2 -n | head
useradd -m -u <UID> -s /bin/bash ansible-deploy
usermod -L ansible-deploy # Passwort sperren
mkdir -p /home/ansible-deploy/.ssh && chmod 700 /home/ansible-deploy/.ssh
# public Key aus ansible/files/ssh/pve-ansible-deploy.pub eintragen:
cat >> /home/ansible-deploy/.ssh/authorized_keys <<'EOF'
from="10.0.0.0/24,10.8.0.0/24",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFtneJFtlwj7D284Yar7ROTflZqKxi/IEyMcIoqazIDD ansible-deploy@ghostnet-pve
EOF
chown -R ansible-deploy:ansible-deploy /home/ansible-deploy/.ssh
chmod 600 /home/ansible-deploy/.ssh/authorized_keys
cat > /etc/sudoers.d/90-ghostnet-ansible-deploy <<'EOF'
ansible-deploy ALL=(ALL) NOPASSWD: ALL
EOF
chmod 0440 /etc/sudoers.d/90-ghostnet-ansible-deploy
visudo -c
# Host-Key-Fingerprint für die Workstation notieren (siehe unten):
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Auf der Workstation: Host-Key-Fingerprint gegen die PVE-Konsole prüfen
(GNAI-011 Abschnitt 3.3), dann known_hosts befüllen und testen:
ssh-keyscan -t ed25519 10.0.0.2 >> ~/.ssh/known_hosts_ghostnet_pve # erst nach Fingerprint-Prüfung!
ssh -o BatchMode=yes ghostnet-pve-ansible-deploy 'id; hostname; sudo -n id -u'
ssh-Alias auf der Workstation (bereits in ~/.ssh/config):
ghostnet-pve-ansible-deploy → ansible-deploy@10.0.0.2 mit
~/.ssh/id_ed25519_ghostnet_pve_ansible_deploy (passphrase-los) und
UserKnownHostsFile=~/.ssh/known_hosts_ghostnet_pve.
Runbook
Alle Befehle aus proxmox/pve-host/ansible/ mit dem venv der Repo-Wurzel:
cd proxmox/pve-host/ansible
../../../.venv/bin/ansible-playbook -i inventories/production/hosts.yml playbooks/preflight.yml --private-key ~/.ssh/id_ed25519_ghostnet_pve_ansible_deploy
../../../.venv/bin/ansible-playbook -i inventories/production/hosts.yml playbooks/site.yml --check --diff --private-key ~/.ssh/id_ed25519_ghostnet_pve_ansible_deploy
../../../.venv/bin/ansible-playbook -i inventories/production/hosts.yml playbooks/site.yml --private-key ~/.ssh/id_ed25519_ghostnet_pve_ansible_deploy
../../../.venv/bin/ansible-playbook -i inventories/production/hosts.yml playbooks/verify-production.yml --private-key ~/.ssh/id_ed25519_ghostnet_pve_ansible_deploy
../../../.venv/bin/ansible-playbook -i inventories/production/hosts.yml playbooks/site.yml --private-key ~/.ssh/id_ed25519_ghostnet_pve_ansible_deploy # changed=0
Secrets-Policy
Keine Passwörter, privaten Schlüssel oder Secrets in Repo/Inventory/Logs. Der
private Deploy-Key liegt nur in ~/.ssh (0600). Der Account hat NOPASSWD
sudo — der Key ist root-äquivalent und wird nur für autorisierte
Infrastruktur-Änderungen genutzt.