Verwaltung durch Personen (Weg 1), AGENTS.md, project-map.md, known-issues.md
ci / test (push) Failing after 24s

Admin-Schlüssel je Person auf ops (Bastion) aus sites/knaster/proxmox.yaml
(access.ops_ssh_keys/_revoked), Playbook admins.yml, Test, Übergabe in
BETRIEB §15. Einstieg für Agenten und neue Admins: AGENTS.md, Projektkarte,
bekannte Probleme. Weg 2 (Verwaltung über NEX) als Entwurf in Phase 9.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Robert Rapp
2026-10-19 18:54:02 +02:00
co-authored by Claude Opus 5.5
parent 039f57a435
commit 50acfa6a95
9 changed files with 379 additions and 0 deletions
+14
View File
@@ -273,3 +273,17 @@ def test_proxmox_site_consistent_with_registry_and_prometheus():
assert vm["driver_generation"] == "modern", slot
vmids = [str(v["vmid"]) for v in vms.values()] + [str(c["vmid"]) for c in site["containers"].values()]
assert len(vmids) == len(set(vmids))
def test_ops_admin_keys_in_site_file():
"""Weg 1: Admins kommen mit eigenem Schlüssel auf ops (playbooks/admins.yml)."""
access = yaml.safe_load((REPO_ROOT / "sites/knaster/proxmox.yaml").read_text())["access"]
keys, revoked = access["ops_ssh_keys"], access["ops_ssh_keys_revoked"]
assert keys # nie leer, sonst sperrt sich die Verwaltung aus
names = [k["name"] for k in keys]
assert len(names) == len(set(names))
for k in [*keys, *revoked]:
parts = k["key"].split()
assert parts[0] in {"ssh-ed25519", "ssh-rsa"} and len(parts) >= 2, k["name"]
assert "PRIVATE" not in k["key"], k["name"]
assert not {k["key"].split()[1] for k in keys} & {k["key"].split()[1] for k in revoked}