Centralized management, version control, and deployment of host-specific configurations
  • Python 71.2%
  • HTML 27.2%
  • CSS 1.6%
Find a file
2026-09-23 10:46:53 +02:00
audit fist commit 2026-09-23 10:45:47 +02:00
cmdb fist commit 2026-09-23 10:45:47 +02:00
integrations fist commit 2026-09-23 10:45:47 +02:00
loom fist commit 2026-09-23 10:45:47 +02:00
skills fist commit 2026-09-23 10:45:47 +02:00
static fist commit 2026-09-23 10:45:47 +02:00
templates fist commit 2026-09-23 10:45:47 +02:00
.gitignore add .gitignore 2026-09-23 10:46:53 +02:00
AGENTS.md fist commit 2026-09-23 10:45:47 +02:00
CLAUDE.md fist commit 2026-09-23 10:45:47 +02:00
GEMINI.md fist commit 2026-09-23 10:45:47 +02:00
manage.py fist commit 2026-09-23 10:45:47 +02:00
README.md fist commit 2026-09-23 10:45:47 +02:00
requirements.txt fist commit 2026-09-23 10:45:47 +02:00

Loom

Loom ist die verbindliche CMDB des MSP-Konzepts (Kapitel 7.3.4). Loom liest Hosts und deren Node Types aus Netbox, die cmdb/-Ordner (Manifest und Vorlagen) der ansible_role_*-Repositories aus Forgejo und die Zugangsdaten aus OpenBAO. Daraus erzeugt Loom die host-spezifischen Konfigurationsdateien, die Ansible-Pull beim Lauf abruft.

Abweichend vom Konzept (C#/.NET 10) ist Loom in Python/Django umgesetzt, die Oberfläche nutzt Bulma.

Funktionen

  • Dashboard – Anzahl Hosts, Node Types, Node-Zuordnungen und ausstehende Vorlagen-Updates; Hinweise auf Hosts ohne oder mit unbekannten Node Types; letzte Aktivitäten; Synchronisation per Knopfdruck
  • Hosts – Inventar aus Netbox mit den Konfigurationsdateien je Host; Detailansicht mit Konfiguration, Changelog und Netbox-Attributen; Konfiguration bearbeiten
  • Vorlagen-Änderungen – ändert sich eine Vorlage im Repository, zeigt Loom den Diff, führt manuelle Host-Anpassungen per Drei-Wege-Merge zusammen und lässt den Vorschlag vor dem Übernehmen bearbeiten (oder verwerfen)
  • Node Types – aus den Repositories gelesen, mit letztem Commit und Benutzer; Detailansicht mit Git-Verlauf und Commit-Diffs
  • Audit Log – unveränderliches Protokoll jeder Aktion (inkl. Anmeldungen), zusätzlich über den Logger loom.audit an das zentrale Logging
  • API für Ansible-Pull – GET /api/v1/hosts/<name>/config mit Authorization: Bearer <pull_token>

Schnellstart (Demo)

python3 -m venv --without-pip .venv
python3 -m pip --python .venv/bin/python install -r requirements.txt
.venv/bin/python manage.py loom_demo_setup --no-input
.venv/bin/python manage.py runserver

Anmeldung unter http://127.0.0.1:8000 mit demo / loom-demo.

Die Demo simuliert Netbox, Forgejo und OpenBAO aus integrations/demo_data/. Das Setup erzeugt die Konfigurationen zunächst aus älteren Vorlagen-Ständen, wendet zwei manuelle Anpassungen an und synchronisiert dann auf den aktuellen Stand – so gibt es sofort offene Vorlagen-Änderungen, darunter eine sauber zusammenführbare und eine mit Konflikt.

Umschalten auf die Produktivumgebung

Der Schalter ist die Umgebungsvariable LOOM_MODE (demo oder live); einzelne Dienste lassen sich mit LOOM_NETBOX_MODE, LOOM_FORGEJO_MODE und LOOM_SECRETS_MODE getrennt umschalten. Die Navigation zeigt den aktiven Modus (DEMO / LIVE / GEMISCHT). Demo- und Live-Modus nutzen getrennte SQLite-Dateien, damit sich die Daten nie vermischen.

Variable Bedeutung
LOOM_MODE demo (Standard) oder live
LOOM_SECRET_KEY Django-Secret-Key (Pflicht, sobald LOOM_DEBUG aus ist)
LOOM_DEBUG Standard: an im Demo-, aus im Live-Modus
LOOM_ALLOWED_HOSTS, LOOM_CSRF_TRUSTED_ORIGINS kommagetrennt
LOOM_NETBOX_URL z. B. https://netbox.intra.heyer.systems
LOOM_NETBOX_NODE_TYPES_FIELD Custom Field der Node Types, Standard node_types
LOOM_FORGEJO_URL, LOOM_FORGEJO_ORG Forgejo-Instanz und Organisation der Rollen-Repos
LOOM_OPENBAO_ADDR, LOOM_OPENBAO_ROLE_ID, LOOM_OPENBAO_SECRET_ID AppRole-Anmeldung
LOOM_OPENBAO_MOUNT, LOOM_OPENBAO_CACERT KV-v2-Mount (Standard secret), CA-Datei
LOOM_DB_NAME, LOOM_DB_USER, LOOM_DB_PASSWORD, LOOM_DB_HOST, LOOM_DB_PORT PostgreSQL statt SQLite

In OpenBAO erwartet Loom: secret/loom/netbox (token), secret/loom/forgejo (token) und secret/loom/api (pull_token).

Die periodische Synchronisation übernimmt ein systemd-Timer mit manage.py loom_sync.

Manifest-Format (cmdb/manifest.yml)

node_type: bookstack            # optional, muss zum Repository-Namen passen
files:
  - template: bookstack.env.j2  # Datei unter cmdb/templates/
    dest: /var/www/bookstack/.env
    owner: www-data
    group: www-data
    mode: "0640"

In Vorlagen stehen die Netbox-Attribute als host.* bereit (name, site, tenant, role, platform, environment, stage, primary_ip, primary_ip4, dns_name, node_types, custom_fields, …).

Entwicklung

Hinweise für Entwickler und KI-Agenten stehen in AGENTS.md, wiederverwendbare Arbeitsabläufe unter skills/.

Lizenz

LGPL-3.0