Files
claude_settings/plans/silly-waddling-dragonfly.md
root 4277b10f55 Kanbanize Kartenerstellung dokumentiert: Arrival-Rule-Workaround, Board-Struktur
- Neuer Abschnitt "Karten erstellen (Aufgaben-Workflow)" mit Workflow A/B
- Bekannte Struktur erweitert: Workflows, Columns, Lanes für Board 1
- Pitfalls ergänzt: Arrival Rule, Parent-Link API, linkedCards read-only
- Settings und Plans aktualisiert

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:09:09 +01:00

235 lines
9.2 KiB
Markdown

# Plan: VMware-Alarme mit VM-Namen in Zabbix anzeigen
## Problem
Die Operational Data bei VMware-Alarm-Triggern zeigt `alarm-127.group-d1` (interner vSphere-Key) statt des VM-Namens. Man sieht nicht, WELCHE VM ein Problem hat.
## Ursache
- `vmware.alarms.get[url]` sammelt Alarme auf **Datacenter-Ebene** (entity `group-d1` = Root)
- Das Alarm-JSON enthält **kein** Entity-/VM-Name-Feld
- Der Trigger-Prototype hat **leere opdata** → Zabbix zeigt den lastvalue (= den nutzlosen Key)
- Das VMware Guest Template hat **keine Alarm-Discovery** (auch nicht in der neusten Version 7.4-1 auf GitHub)
## Lösung: Per-VM Alarm-Discovery zum VMware Guest Template hinzufügen
`vmware.vm.alarms.get[url, uuid]` existiert als Item-Key in Zabbix 7.0 — wird nur nicht im Template verwendet. Wenn wir Alarm-Discovery auf die VMware Guest Hosts bringen, erscheinen Alarm-Trigger direkt auf dem jeweiligen VM-Host. **Der Host-Name im Dashboard IST der VM-Name** → Problem gelöst.
### Warum das funktioniert
vSphere feuert Alarme auf **zwei Ebenen**:
1. **Datacenter-Level:** Gesamtstatus ("irgendwo gibt es ein Backup-Problem") → aktueller Zustand
2. **Entity-Level (VM/Host):** Alarm auf der spezifischen VM die das Problem hat → was wir brauchen
`vmware.vm.alarms.get` liefert die Entity-Level Alarme pro VM.
## Schritte
### Schritt 0: Template-Backup (PFLICHT, VOR jeder Änderung)
Vollständige Exports beider VMware-Templates via Zabbix API als JSON-Backup. Enthält ALLE Objekte: Items, Triggers, Discovery Rules, Item-/Trigger-Prototypen, Tags, Preprocessing, Macros, Dependencies.
**a) VMware Guest Template (10174) — wird geändert:**
```
configuration.export format=json options.templates=[10174]
→ ~/Nextcloud/vinos/zabbix/backups/vmware-guest-template-10174-backup.json
```
**b) VMware Template (10173) — opdata-Änderung:**
```
configuration.export format=json options.templates=[10173]
→ ~/Nextcloud/vinos/zabbix/backups/vmware-template-10173-backup.json
```
**c) Verifizierung der Backups:**
- Dateigröße prüfen (sollte mehrere KB sein)
- JSON-Validität prüfen (`python3 -m json.tool`)
- Stichprobe: Tags im Backup vorhanden? (grep nach "tags")
- Stichprobe: Trigger-Prototypen im Backup? (grep nach "trigger_prototypes")
**Restore bei Problemen:**
```
configuration.import format=json source=[Dateiinhalt] rules.templates.updateExisting=true
```
**Backups werden ins Git committed** (`zabbix/backups/`) damit sie versioniert und jederzeit wiederherstellbar sind.
### Schritt 1: Quick-Fix — opdata auf bestehendem Trigger-Prototype verbessern
**Template-Ebene** (VMware Template ID 10173):
- Trigger-Prototype ID `54450``opdata` setzen auf `{#VMWARE.ALARMS.STATUS}`
- Zeigt dann "red"/"yellow" statt "alarm-127.group-d1"
- Betrifft alle 5 entdeckten Alarme auf srv-nu-vcenter01
**API-Call:**
```
triggerprototype.update: triggerid=54450, opdata="{#VMWARE.ALARMS.STATUS}"
```
### Schritt 2: Validierung — Per-VM Alarme testen
**Bevor wir das Template ändern**, prüfen ob `vmware.vm.alarms.get` pro VM funktioniert:
1. Temporäres Test-Item auf einer VM erstellen (z.B. SRV-DATA01, Host-ID 10893):
- Key: `vmware.vm.alarms.get[{$VMWARE.URL},{$VMWARE.VM.UUID}]`
- Type: Simple Check
- Value Type: Text
- History: 1h
2. Warten bis Daten kommen (1-2 Min)
3. Prüfen ob der Backup-Alarm in den per-VM Daten auftaucht
4. Test-Item wieder löschen
**Mögliche Ergebnisse:**
- JSON enthält den Alarm → weiter mit Schritt 3
- JSON ist leer → Backup-Alarm feuert nur auf Datacenter-Ebene, Schritt 3 bringt für diesen speziellen Alarm nichts
### Schritt 3: Neues Template "VMware Guest Alarms" erstellen (PARALLEL, nicht am Original)
**Strategie:** Statt das Original-Template (10174) zu modifizieren, erstellen wir ein **separates Template** mit nur der Alarm-Discovery. Dieses wird zusätzlich zu "VMware Guest" auf die VM-Hosts gelinkt.
**Vorteile:**
- Original "VMware Guest" bleibt 100% unverändert
- Bei Problemen: Template unlinken → alle Alarm-Items sofort weg
- Nachbesserungen am neuen Template ohne Risiko
- Bei Zabbix-Update wird das Original-Template aktualisiert, unser Custom-Template bleibt
**Template-Name:** `VMware Guest Alarms`
**Host Group:** Gleiche wie VMware Guest (wird beim Linken automatisch zugewiesen)
**a) Template erstellen:**
```
template.create:
host: "VMware Guest Alarms"
name: "VMware Guest Alarms"
description: "Per-VM Alarm-Discovery für VMware Guest Hosts.
Ergänzt das Standard VMware Guest Template um Alarm-Monitoring.
Benötigt Macros {$VMWARE.URL} und {$VMWARE.VM.UUID} vom VMware Guest Template."
groups: [{groupid: <Templates-Gruppe>}]
```
**b) Master-Item (Simple Check):**
```
item.create:
hostid: [neues Template]
name: "Get VM alarms"
key: vmware.vm.alarms.get[{$VMWARE.URL},{$VMWARE.VM.UUID}]
type: Simple Check (3)
value_type: Text (4)
history: 0
delay: 0 (VMware Collector)
```
**c) Discovery Rule (Dependent):**
```
discoveryrule.create:
hostid: [neues Template]
name: "VMware VM alarm discovery"
key: vmware.vm.alarms.discovery
type: Dependent (18)
master_itemid: [Get VM alarms Item]
lifetime: 0
LLD Macro Paths:
{#VMWARE.ALARMS.DESC} → $.description
{#VMWARE.ALARMS.KEY} → $.key
{#VMWARE.ALARMS.NAME} → $.name
{#VMWARE.ALARMS.STATUS} → $.overall_status
```
**d) Item-Prototype (Dependent):**
```
itemprototype.create:
ruleid: [Discovery Rule]
hostid: [neues Template]
name: "{#VMWARE.ALARMS.NAME}"
key: vmware.vm.alarms.status["{#VMWARE.ALARMS.KEY}"]
type: Dependent (18)
master_itemid: [Get VM alarms Item]
value_type: Character (1)
preprocessing:
1. JSONPath: $.[?(@.key == "{#VMWARE.ALARMS.KEY}")].key.first()
error_handler: set value to -1
2. Throttling: 1h
```
**e) Trigger-Prototype:**
```
triggerprototype.create:
description: "VMware VM: {#VMWARE.ALARMS.NAME}" ← "VM:" um von vCenter-Level zu unterscheiden
expression: last(/VMware Guest Alarms/vmware.vm.alarms.status["{#VMWARE.ALARMS.KEY}"])<>-1
opdata: "{#VMWARE.ALARMS.STATUS}"
priority: 0 (Not classified) ← gleich wie vCenter-Level Trigger
comments: "{#VMWARE.ALARMS.DESC}"
tags: [{"tag": "scope", "value": "notice"}]
```
**Tag-Kontext:** Das Notification-System basiert auf Tags wie `Meldung_Webhook_*` / `Meldung_Mail_*` (siehe notifications.md). Der `scope=notice` Tag kommt vom Template. Spezifische Routing-Tags (`Meldung_*`) werden bei Bedarf nachträglich auf entdeckte Trigger gesetzt — nicht auf dem Prototype.
### Schritt 3b: Template auf VMware Guest Hosts linken
**Erst auf einem Test-Host:**
1. Template "VMware Guest Alarms" auf SRV-DATA01 (10893) linken
2. Warten bis Master-Item Daten liefert (~1-2 Min)
3. LLD abwarten (~5-10 Min)
4. Prüfen ob Alarm-Items erstellt werden
**Bei Erfolg auf alle VMware Guest Hosts:**
- `host.get` mit `templateids=[10174]` → Liste aller VMware Guest Hosts
- `host.massupdate` mit templates: bestehende + neues Template
### Schritt 4: Verifizierung
1. Warten bis LLD auf VMware Guest Hosts läuft (~5-10 Min)
2. Prüfen ob per-VM Alarm-Items erstellt werden
3. Prüfen ob der Backup-Alarm auf der betroffenen VM auftaucht
4. Dashboard-Anzeige prüfen: VM-Name sollte in Host-Spalte stehen
### Schritt 5: Aufräumen
- History am Master-Item `vmware.alarms.get` auf vCenter (120476) zurück auf `0` setzen
- Ggf. den Datacenter-Level Alarm-Trigger deaktivieren oder behalten (als Fallback)
### Schritt 6: Dokumentation + Commits
- `zabbix/README.md`: VMware Alarm-Monitoring Pattern dokumentieren
- `zabbix/copilot-instructions.md`: Pitfall dokumentieren (opdata leer = zeigt lastvalue)
- Infrastructure: Falls relevant
- Commits in zabbix-Repo + pushen
## Risiken & Fallbacks
| Risiko | Auswirkung | Fallback |
|--------|-----------|----------|
| `vmware.vm.alarms.get` liefert keine per-VM Alarme | Backup-Alarm nur auf Datacenter-Ebene | opdata-Fix (Schritt 1) ist trotzdem besser als Status quo |
| Viele neue Items pro VM | Mehr Last auf Zabbix-Server | Items haben 1h Throttling, Master-Item hat `delay=0` (VMware Collector Intervall) |
| Neues Template funktioniert nicht wie erwartet | Falsches/kein Discovery | **Template unlinken** → alle Items/Trigger sofort weg, kein Restrisiko |
## Rollback-Strategie
1. **Per-VM Alarms funktionieren nicht:** Template "VMware Guest Alarms" von Hosts unlinken → fertig
2. **opdata-Änderung problematisch:** `triggerprototype.update` opdata zurück auf "" → LLD re-run
3. **Komplett-Rollback:** Template-Backup importieren via `configuration.import`
## Betroffene Dateien/Objekte
| Was | ID | Aktion |
|-----|-----|--------|
| VMware Template Trigger-Prototype | 54450 | opdata setzen |
| **NEUES** Template "VMware Guest Alarms" | (wird erstellt) | Alarm-Discovery für VMs |
| VMware Guest Template | 10174 | **NICHT geändert** (nur Backup) |
| Master-Item vCenter (temporär) | 120476 | History zurück auf 0 |
| `zabbix/README.md` | — | Doku ergänzen |
## Verifizierung
```bash
# Nach Schritt 2: Test-Item prüfen
item.get hostids=[10893] search={"key_": "vm.alarms"}
history.get itemids=[TEST_ITEM_ID] history=4
# Nach Schritt 3: Per-VM Alarm Discovery prüfen
item.get templateids=[10174] search={"key_": "alarm"}
# Auf einem VMware Guest Host:
item.get hostids=[10893] search={"key_": "alarm"}
trigger.get hostids=[10893] search={"description": "Backup"}
```