diff --git a/copilot-instructions.md b/copilot-instructions.md index bccd16e..789a6a2 100644 --- a/copilot-instructions.md +++ b/copilot-instructions.md @@ -1,10 +1,29 @@ # VINOS Zabbix Server (srv-monitor02) - Copilot Instructions +## Inhaltsverzeichnis + +1. [Mandatory Rules](#mandatory-rules) +2. [System Overview](#system-overview) +3. [Quick Reference](#quick-reference) +4. [API-Zugriff](#api-zugriff) +5. [Bekannte Hosts](#bekannte-hosts) +6. [Netzlaufwerk-Pfade](#netzlaufwerk-pfade) +7. [Troubleshooting-Checklisten](#troubleshooting-checklisten) +8. [Bekannte Probleme & Lösungen](#bekannte-probleme--lösungen) +9. [Notification-System](#notification-system-tags) +10. [SSH-Befehle Sammlung](#ssh-befehle-sammlung) +11. [Pitfalls](#pitfalls) + +--- + ## MANDATORY RULES - **API-Schlüssel:** Liegt in `api.txt` (NICHT committen!) - **Zabbix Version:** 7.0.3 (API-Syntax beachten - 7.x hat geänderte Parameter) - Authentifizierung per Bearer Token im Authorization Header +- Bei `trigger.update` mit `tags`: **ALLE existierenden Tags mit angeben**, sonst werden sie überschrieben! + +--- ## System Overview @@ -16,6 +35,39 @@ | **Zabbix Version** | 7.0.3 | | **Kunde** | VINOS | +--- + +## Quick Reference + +### API-Methoden Schnellübersicht + +| Aufgabe | Methode | Wichtige Parameter | +|---------|---------|-------------------| +| Aktuelle Probleme | `problem.get` | `recent: true` | +| Problem → Host | `trigger.get` | `triggerids: [X], selectHosts` | +| Alle feuernden Trigger | `trigger.get` | `only_true: true, active: true` | +| Host suchen | `host.get` | `search: {name: "..."}` | +| Items eines Hosts | `item.get` | `hostids: [X]` | +| Trigger aktivieren/deaktivieren | `trigger.update` | `triggerid, status` | +| Tag hinzufügen | `trigger.update` | `triggerid, tags: [...]` | + +### Host-ID Schnellreferenz + +| Host | HostID | Typ | +|------|--------|-----| +| SRV-DB12 REMA Datenbank | 10786 | MSSQL | +| SRV-JOB01 | 10636 | Windows/Tasks | + +### Wichtige Trigger-IDs + +| TriggerID | Name | Host | Kategorie | +|-----------|------|------|-----------| +| 44829 | processing_backup_monitoring_hours_crif | SRV-JOB01 | Interface/CRIF | +| 47905 | MSSQL Job 'Backup_tgl.Subplan_1' | SRV-DB12 | Datenbank | +| 47907 | MSSQL Job 'Backup_Log.Subplan_1' | SRV-DB12 | Datenbank | + +--- + ## API-Zugriff ### Authentifizierung (Zabbix 7.x) @@ -34,12 +86,32 @@ curl -sk -X POST "https://srv-monitor02/api_jsonrpc.php" \ ### Wichtige API-Änderungen in 7.x -- `selectHosts` bei `problem.get` nicht mehr unterstützt - stattdessen `trigger.get` mit `selectHosts` verwenden +- `selectHosts` bei `problem.get` nicht mehr unterstützt - `apiinfo.version` OHNE Authorization Header aufrufen ### Nützliche Abfragen -**Aktuelle Probleme:** +**Alle feuernden Trigger MIT Host-Informationen (Einschritt-Abfrage):** +```json +{ + "method": "trigger.get", + "params": { + "output": ["triggerid", "description", "priority", "lastchange"], + "only_true": true, + "active": true, + "expandDescription": true, + "selectHosts": ["hostid", "host", "name"], + "selectItems": ["itemid", "name", "key_", "lastvalue"], + "selectTags": "extend", + "sortfield": "lastchange", + "sortorder": "DESC", + "limit": 30 + } +} +``` +*Dies zeigt alle aktuell feuernden Trigger direkt mit Host-Namen - effizienter als problem.get + trigger.get!* + +**Aktuelle Probleme (nur IDs):** ```json { "method": "problem.get", @@ -52,6 +124,7 @@ curl -sk -X POST "https://srv-monitor02/api_jsonrpc.php" \ } } ``` +*Hinweis: `objectid` im Result = Trigger-ID* **Trigger-Details mit Host:** ```json @@ -62,7 +135,19 @@ curl -sk -X POST "https://srv-monitor02/api_jsonrpc.php" \ "triggerids": [""], "expandDescription": true, "selectHosts": ["hostid", "host", "name"], - "selectItems": ["itemid", "name", "key_", "lastvalue"] + "selectItems": ["itemid", "name", "key_", "lastvalue"], + "selectTags": "extend" + } +} +``` + +**Host-ID ermitteln:** +```json +{ + "method": "host.get", + "params": { + "output": ["hostid", "host", "name"], + "search": {"name": "SRV-JOB"} } } ``` @@ -79,22 +164,117 @@ curl -sk -X POST "https://srv-monitor02/api_jsonrpc.php" \ } ``` +--- + ## Bekannte Hosts -| Host | HostID | Beschreibung | -|------|--------|--------------| -| SRV-DB12 REMA Datenbank | 10786 | MSSQL Server mit Wartungsplänen | -| SRV-JOB01 | 10636 | Windows Server für Scheduled Tasks (WinSCP, Monitoring) | +| Host | HostID | Typ | Beschreibung | SSH-Zugang | +|------|--------|-----|--------------|------------| +| SRV-DB12 REMA Datenbank | 10786 | MSSQL | Wartungspläne, Backups | - | +| SRV-JOB01 | 10636 | Windows | Scheduled Tasks, WinSCP, CRIF | `vinos\rwi@srv-job01` | -### SSH-Zugang zu Windows-Servern +### Windows Zabbix Agent Pfade -SRV-JOB01 hat OpenSSH installiert. SSH-Key ist bereits hinterlegt: +| Server | Agent Version | Config-Pfad | +|--------|---------------|-------------| +| SRV-JOB01 | Agent 2 | `C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf` | +| Standard Win | Agent 2 | `C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf` | +| Standard Win | Agent 1 | `C:\Program Files\Zabbix Agent\zabbix_agentd.conf` | -```bash -ssh 'vinos\rwi@srv-job01' "Get-ScheduledTask" +**UserParameter finden:** +```powershell +Get-Content "C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf" | Select-String "UserParameter" ``` -**Zabbix Agent 2 Config:** `C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf` +### Wichtige Item-Keys (UserParameters) + +| Item Key | Host | Bedeutung | Return | +|----------|------|-----------|--------| +| `processing_backup_monitoring_hours_crif` | SRV-JOB01 | CRIF Backup-Alter | 0=OK, 1=Fehler (keine Datei <1 Tag) | +| `processing_import_monitoring_crif` | SRV-JOB01 | CRIF Import Status | 0=OK, 1=Fehler | +| `mssql.job.runstatus[*]` | DB-Server | SQL Job Status | 0=Fehler, 1=OK | +| `mssql.job.lastrunstatusmessage[*]` | DB-Server | SQL Job Fehlermeldung | Text | + +--- + +## Netzlaufwerk-Pfade + +### NAV-Schnittstellen + +| UNC-Pfad | Zweck | +|----------|-------| +| `\\vinos.local\sys\nav\interfaces\` | Alle NAV-Schnittstellen (Root) | +| `\\vinos.local\sys\nav\interfaces\CRIFBuergel\` | CRIF Bürgel Export | +| `\\vinos.local\sys\nav\interfaces\CRIFBuergel\exp\` | Pending Exports (NAV legt hier ab) | +| `\\vinos.local\sys\nav\interfaces\CRIFBuergel\backup\` | Erfolgreiche Exports (nach Upload) | +| `\\vinos.local\sys\nav\interfaces\CRIFBuergel\log\` | WinSCP Transfer-Logs | +| `\\vinos.local\sys\nav\interfaces\HVB\` | HVB Schnittstelle | + +### Externe Systeme + +| System | Host | Port | Pfad | Zweck | +|--------|------|------|------|-------| +| CRIF Bürgel | ftp.crif.de | 22 (SFTP) | /in/WeinVinos/ | Export-Upload | + +--- + +## Troubleshooting-Checklisten + +### MSSQL Job schlägt fehl + +1. [ ] Zabbix-Problem analysieren (`objectid` = Trigger-ID) +2. [ ] `mssql.job.lastrunstatusmessage` Item prüfen für Fehlermeldung +3. [ ] Fehlercode recherchieren: + - `0x534` = Account nicht im AD auflösbar → Job-Besitzer ändern +4. [ ] Job-Besitzer in SSMS prüfen: SQL Server Agent → Jobs → Properties +5. [ ] Job-History in SSMS prüfen +6. [ ] Nach Fix: **Manuell Job starten** zum Verifizieren (Rechtsklick → Start Job) +7. [ ] Zabbix-Problem sollte sich automatisch schließen nach erfolgreichem Lauf + +### Scheduled Task schlägt fehl (Windows) + +```bash +# 1. Task-Status prüfen +ssh 'vinos\rwi@srv-job01' "Get-ScheduledTask -TaskName 'TASKNAME' | Select-Object TaskName, State" + +# 2. Letzte Ausführung und Result +ssh 'vinos\rwi@srv-job01' "Get-ScheduledTaskInfo -TaskName 'TASKNAME' | Select-Object LastRunTime, LastTaskResult, NextRunTime" + +# 3. Task manuell starten +ssh 'vinos\rwi@srv-job01' "Start-ScheduledTask -TaskName 'TASKNAME'" +``` + +**LastTaskResult Codes:** +- `0` = Erfolg +- `1` = Fehler (allgemein) +- `267009` = Task läuft noch + +### Interface-Export fehlt (CRIF, HVB, etc.) + +1. [ ] **Export-Ordner prüfen:** Dateien vorhanden? + ```bash + ssh 'vinos\rwi@srv-job01' "Get-ChildItem '\\vinos.local\sys\nav\interfaces\CRIFBuergel\exp'" + ``` +2. [ ] **Backup-Ordner prüfen:** Wann war letzte erfolgreiche Datei? + ```bash + ssh 'vinos\rwi@srv-job01' "Get-ChildItem '\\vinos.local\sys\nav\interfaces\CRIFBuergel\backup' | Sort-Object LastWriteTime -Descending | Select-Object -First 5 Name, LastWriteTime" + ``` +3. [ ] **NAV Aufgabenwarteschlange prüfen** (häufigste Ursache!) +4. [ ] **WinSCP/Transfer-Log prüfen:** + ```bash + ssh 'vinos\rwi@srv-job01' "Get-Content '\\vinos.local\sys\nav\interfaces\CRIFBuergel\log\2026-01_Transfer-FilesWinSCP.log' | Select-Object -Last 30" + ``` +5. [ ] **SFTP-Verbindung manuell testen** (Config: `C:\Tasks\crifbuergel\CRIF-config.xml`) + +### Zabbix-Problem bleibt nach Fix offen + +1. [ ] Item-Wert prüfen - hat sich der `lastvalue` geändert? +2. [ ] `lastclock` prüfen - wann wurde zuletzt abgefragt? +3. [ ] Problem-Status prüfen: `r_eventid` vorhanden = resolved +4. [ ] Bei Item-Type "Active": Warten auf nächsten Agent-Push +5. [ ] Seite refreshen (F5) - UI-Cache + +--- ## Bekannte Probleme & Lösungen @@ -108,69 +288,42 @@ von Auftrag 'Jobname' Serverzugriff aufweist. konnten nicht abgerufen werden, Fehlercode 0x534. [SQLSTATE 42000] (Fehler 15404)) ``` -**Ursache:** -Der SQL Server kann den Job-Besitzer (Windows-Account) nicht mehr im Active Directory auflösen. +**Ursache:** SQL Server kann Job-Besitzer nicht im AD auflösen (User gelöscht/deaktiviert). -**Lösungen:** +**Lösung - Job-Besitzer auf `sa` ändern:** +```sql +USE msdb; +GO +EXEC dbo.sp_update_job + @job_name = N'Backup_tgl.Subplan_1', + @owner_login_name = N'sa'; +GO +``` -1. **Job-Besitzer auf `sa` ändern (empfohlen):** - ```sql - USE msdb; - GO - EXEC dbo.sp_update_job - @job_name = N'Backup_tgl.Subplan_1', - @owner_login_name = N'sa'; - GO - ``` +**Oder via SSMS:** Job Properties → General → Owner → `sa` -2. **Alle Jobs eines Benutzers auf `sa` ändern:** - ```sql - USE msdb; - GO - DECLARE @job_id uniqueidentifier - DECLARE job_cursor CURSOR FOR - SELECT job_id FROM sysjobs WHERE owner_sid = SUSER_SID('VINOS\gt') - - OPEN job_cursor - FETCH NEXT FROM job_cursor INTO @job_id - WHILE @@FETCH_STATUS = 0 - BEGIN - EXEC dbo.sp_update_job @job_id = @job_id, @owner_login_name = N'sa' - FETCH NEXT FROM job_cursor INTO @job_id - END - CLOSE job_cursor - DEALLOCATE job_cursor - GO - ``` - -3. **Via SSMS:** - - Job Properties → General → Owner → Auf `sa` ändern - -**Verifizierung nach Fix:** -- In Zabbix: Problem sollte nach nächstem erfolgreichen Job-Lauf automatisch schließen -- Oder manuell Job starten und Status prüfen +**Nach Fix:** Manuell Job starten, Zabbix-Problem schließt automatisch. ### CRIF Bürgel Export-Monitoring (`processing_backup_monitoring_hours_crif`) -**Trigger:** Prüft ob im Verzeichnis `\\vinos.local\sys\nav\interfaces\CRIFBuergel\backup` Dateien vorhanden sind, die jünger als 1 Tag sind. +**Trigger:** Prüft ob in `\\vinos.local\sys\nav\interfaces\CRIFBuergel\backup` Dateien jünger als 1 Tag sind. **Ablauf des CRIF-Exports:** -1. **NAV/Business Central** erstellt `CL_*.dat.zip` Exportdateien in `\CRIFBuergel\exp\` -2. **Scheduled Task** `Transfer-FilesWinSCP` (SRV-JOB01, täglich 02:00) lädt Dateien zu `ftp.crif.de` hoch -3. Nach erfolgreichem Upload werden Dateien nach `\CRIFBuergel\backup\` verschoben +1. **NAV/Business Central** erstellt `CL_*.dat.zip` in `\CRIFBuergel\exp\` +2. **Scheduled Task** `Transfer-FilesWinSCP` (SRV-JOB01, 02:00) lädt zu `ftp.crif.de` hoch +3. Nach Upload: Dateien werden nach `\CRIFBuergel\backup\` verschoben -**Bei Fehler prüfen:** -1. **Export-Ordner leer?** → NAV Aufgabenwarteschlange prüfen (häufigste Ursache!) -2. **WinSCP-Log prüfen:** `\\vinos.local\sys\nav\interfaces\CRIFBuergel\log\` -3. **SFTP-Verbindung testen:** Config in `C:\Tasks\crifbuergel\CRIF-config.xml` +**Häufigste Ursache:** NAV Aufgabenwarteschlange läuft nicht! **CRIF FTP-Server Struktur:** - `/in/WeinVinos/` - Upload-Ziel für Exports -- `/out/` - (leer, keine Downloads) +- `/out/` - leer (keine Downloads) + +--- ## Notification-System (Tags) -Zabbix Actions filtern nach **Tags** auf Triggern. Um Benachrichtigungen zu aktivieren, muss der Trigger das entsprechende Tag haben. +Zabbix Actions filtern nach **Tags** auf Triggern. | Tag | Ziel | |-----|------| @@ -180,6 +333,7 @@ Zabbix Actions filtern nach **Tags** auf Triggern. Um Benachrichtigungen zu akti | `Meldung_Mail_Bereitschaft` | bereitschaft.it@vinos.de | | `Meldung_Mail_BI` | BI-Team | | `Meldung_Mail_HM` | HM_Monitoring@vinos.de | +| `Meldung_Mail_HM_Mo-Fr_9-1730` | HM nur Werktags 9-17:30 | | `Meldung_RM_Monitoring` | RM_Monitoring@vinos.de | | `Meldung_Mail_Viki` | viki@vinos.de | @@ -196,16 +350,81 @@ Zabbix Actions filtern nach **Tags** auf Triggern. Um Benachrichtigungen zu akti } } ``` -**Wichtig:** Alle existierenden Tags müssen mit angegeben werden, sonst werden sie überschrieben! +**WICHTIG:** Alle existierenden Tags müssen mit angegeben werden! -## Development Workflow +**Aktuelle Tags eines Triggers abfragen:** +```json +{ + "method": "trigger.get", + "params": { + "triggerids": [""], + "selectTags": "extend" + } +} +``` -1. API-Abfragen testen mit `curl` und `jq` -2. Bei komplexeren Abfragen: Immer zuerst die relevanten IDs ermitteln -3. Dokumentation aktualisieren bei neuen Erkenntnissen +--- + +## SSH-Befehle Sammlung (SRV-JOB01) + +### Scheduled Tasks + +```bash +# Alle aktiven Tasks auflisten +ssh 'vinos\rwi@srv-job01' "Get-ScheduledTask | Where-Object {\$_.State -ne 'Disabled'} | Select-Object TaskName, State, TaskPath | Format-Table -AutoSize" + +# Task-Details mit letzter Ausführung +ssh 'vinos\rwi@srv-job01' "Get-ScheduledTaskInfo -TaskName 'Transfer-FilesWinSCP' -TaskPath '\Crifbürgel\'" + +# Task manuell starten +ssh 'vinos\rwi@srv-job01' "Start-ScheduledTask -TaskName 'Transfer-FilesWinSCP' -TaskPath '\Crifbürgel\'" + +# Task-Actions anzeigen (was wird ausgeführt) +ssh 'vinos\rwi@srv-job01' "(Get-ScheduledTask -TaskName 'Transfer-FilesWinSCP').Actions | Select-Object Execute, Arguments" +``` + +### Dateien und Ordner + +```bash +# Dateien auflisten mit Datum +ssh 'vinos\rwi@srv-job01' "Get-ChildItem '\\vinos.local\sys\nav\interfaces\CRIFBuergel\backup' | Sort-Object LastWriteTime -Descending | Select-Object -First 10 Name, LastWriteTime, Length" + +# Prüfen ob Ordner leer ist +ssh 'vinos\rwi@srv-job01' "if ((Get-ChildItem 'PFAD' | Measure-Object).Count -eq 0) { 'LEER' } else { 'Dateien vorhanden' }" + +# Log-Datei lesen (letzte 30 Zeilen) +ssh 'vinos\rwi@srv-job01' "Get-Content 'LOGPFAD' | Select-Object -Last 30" +``` + +### Zabbix Agent + +```bash +# Agent-Config lesen +ssh 'vinos\rwi@srv-job01' "Get-Content 'C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf'" + +# UserParameter finden +ssh 'vinos\rwi@srv-job01' "Get-Content 'C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf' | Select-String 'UserParameter'" + +# Agent-Service Status +ssh 'vinos\rwi@srv-job01' "Get-Service *zabbix* | Select-Object Name, Status, StartType" +``` + +--- + +## Scheduled Tasks Inventar (SRV-JOB01) + +| Task Name | TaskPath | Zeitplan | Zweck | +|-----------|----------|----------|-------| +| Transfer-FilesWinSCP | \Crifbürgel\ | 02:00 täglich | CRIF Export Upload zu ftp.crif.de | +| Remove-Oldfiles.ps1 | \Crifbürgel\ | 18:00 täglich | Alte CRIF-Backups löschen (>30 Tage) | + +--- ## Pitfalls -- **API-Version prüfen:** Zabbix 7.x hat viele Breaking Changes gegenüber 6.x +- **API-Version:** Zabbix 7.x hat Breaking Changes gegenüber 6.x - **SSL-Zertifikat:** `-sk` Flag bei curl verwenden (self-signed cert) -- **Timestamps:** Zabbix liefert Unix-Timestamps, ggf. konvertieren +- **Timestamps:** Zabbix liefert Unix-Timestamps, konvertieren mit `date -d @TIMESTAMP` +- **Tags überschreiben:** Bei `trigger.update` immer ALLE Tags angeben +- **PowerShell Escaping:** Bei SSH zu Windows auf `$` und Quotes achten (`\$` verwenden) +- **Active Items:** Wert aktualisiert sich erst beim nächsten Agent-Push, nicht sofort