From fbc7870325556e308134646521bc8c6049355f69 Mon Sep 17 00:00:00 2001 From: smolkik-code Date: Thu, 13 Aug 2026 15:44:28 +0700 Subject: [PATCH] Expand Russian setup documentation --- README.md | 435 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 358 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index 90cece2..f97f0d6 100644 --- a/README.md +++ b/README.md @@ -1,142 +1,426 @@ -# Veeam Backup Jobs for Zabbix +# Мониторинг Veeam Backup Jobs в Zabbix 7.0 -This repository contains PowerShell scripts for Veeam Backup & Replication: +Репозиторий содержит готовый сборщик состояния заданий Veeam Backup & Replication +и шаблон Zabbix 7.0. -- `Monitor-VeeamJobs.ps1` collects job metrics for Zabbix. -- `NotifyOfDisabledJobs.ps1` sends an email when disabled jobs are detected. -- `zabbix-templete-veeam-jobs.xml` imports the Zabbix 7.0 template. +## Что входит в проект -## Zabbix collector output +| Файл | Назначение | +| --- | --- | +| `Monitor-VeeamJobs.ps1` | Основной скрипт для Zabbix. Собирает задания Veeam и отдает JSON. | +| `zabbix-templete-veeam-jobs.xml` | Шаблон Zabbix 7.0 с item-ами, discovery и триггерами. | +| `NotifyOfDisabledJobs.ps1` | Старый отдельный скрипт email-уведомлений о выключенных заданиях. Для Zabbix не нужен. | -`Monitor-VeeamJobs.ps1` prints one compressed JSON object by default: +Для мониторинга через Zabbix нужен именно: + +```text +Monitor-VeeamJobs.ps1 +``` + +## Что собирается + +Скрипт собирает: + +- общее количество заданий Veeam; +- количество выключенных заданий, с учетом файла исключений; +- количество успешно выполненных заданий; +- количество заданий с ошибкой; +- количество заданий с предупреждением; +- имена выключенных заданий; +- имена выключенных заданий, попавших в исключения; +- имена заданий с ошибками; +- имена заданий с предупреждениями; +- таблицу всех заданий; +- краткую сводку всех заданий для dashboard; +- discovered items по каждому заданию. + +По каждому заданию собирается: + +- имя; +- включено расписание или нет; +- время последнего запуска; +- время следующего запуска, если Veeam его отдает; +- последний результат; +- состояние последней сессии; +- количество restore points, если Veeam позволяет сопоставить job и backup. + +Подсчет restore points работает по принципу best effort. Скрипт использует +`Get-VBRBackup` и `Get-VBRRestorePoint`. Если для конкретного типа задания Veeam +не позволяет надежно сопоставить backup с job, задание все равно будет показано, +а restore points будут отображены как `-`. + +## Установка на Veeam-сервер + +Создай папку для скриптов Zabbix Agent 2, если ее еще нет: + +```text +C:\Program Files\Zabbix Agent 2\scripts +``` + +Скопируй туда файл: + +```text +C:\Program Files\Zabbix Agent 2\scripts\Monitor-VeeamJobs.ps1 +``` + +Проверь ручной запуск на Veeam-сервере: + +```powershell +powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix Agent 2\scripts\Monitor-VeeamJobs.ps1" +``` + +В ответ должен прийти JSON, примерно такой: ```json { - "total": 10, - "disabled": 1, - "successful": 7, + "total": 49, + "disabled": 0, + "successful": 45, "error": 1, - "warning": 1, - "disabled_names": "Disabled job", - "disabled_excluded_names": "Policy disabled by design", + "warning": 3, + "disabled_names": "-", + "disabled_excluded_names": "D_Migratio_DRP", "error_names": "Failed job", "warning_names": "Warning job", "jobs_table": "Name | Enabled | Last run | Next run | Result | Restore points\n...", - "jobs_summary": "Job | Enabled | Last run | Next run | Result | Restore points\nDaily backup | yes | 2026-07-16 01:00:00 | 2026-07-17 01:00:00 | Success | 14", + "jobs_summary": "Job | Enabled | Last run | Next run | Result | Restore points\n...", "jobs_lld": { "data": [ { - "{#VEEAMJOBKEY}": "RGFpbHkgYmFja3Vw", - "{#VEEAMJOBNAME}": "Daily backup" + "{#VEEAMJOBKEY}": "dm5hbXp0cjAwNA", + "{#VEEAMJOBNAME}": "vnamztr004" } ] }, "jobs": [ { - "key": "RGFpbHkgYmFja3Vw", - "name": "Daily backup", + "key": "dm5hbXp0cjAwNA", + "name": "vnamztr004", "enabled": true, "enabled_numeric": 1, "enabled_text": "yes", "last_run": "2026-07-16 01:00:00", - "next_run": "2026-07-17 01:00:00", + "next_run": "-", "last_result": "Success", "last_state": "Stopped", "result": "Success", - "restore_points": 14, - "restore_points_text": "14", - "summary": "Enabled: yes | Last: 2026-07-16 01:00:00 | Next: 2026-07-17 01:00:00 | Result: Success | Restore points: 14" + "restore_points": 19, + "restore_points_text": "19", + "summary": "Enabled: yes | Last: 2026-07-16 01:00:00 | Next: - | Result: Success | Restore points: 19" } ] } ``` -Restore point counting is best effort. The script uses `Get-VBRBackup` and -`Get-VBRRestorePoint` when both cmdlets are available; if Veeam cannot map a job -to backups in the current environment, the job remains visible and its restore -point count is shown as `-`. +## Настройка Zabbix Agent 2 -## Discovered per-job items - -The template uses a dependent low-level discovery rule: +В файл конфигурации агента: ```text -veeam.jobs.discovery +C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf ``` -It creates one set of discovered items per Veeam job: +добавь строку: + +```ini +UserParameter=veeam.scripts.monitor,powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix Agent 2\scripts\Monitor-VeeamJobs.ps1" +``` + +Для Veeam-сервера обычно нужно увеличить timeout, потому что сбор restore points +и последних сессий может занимать больше стандартных 3 секунд: + +```ini +Timeout=30 +``` + +Перезапусти агент: + +```powershell +Restart-Service "Zabbix Agent 2" +``` + +Проверь выполнение через агент: + +```cmd +"C:\Program Files\Zabbix Agent 2\zabbix_agent2.exe" -t veeam.scripts.monitor +``` + +Если команда возвращает JSON, агент настроен правильно. + +## Импорт шаблона в Zabbix + +В Zabbix открой: ```text -veeam.job.enabled[{#VEEAMJOBKEY}] -veeam.job.last_run[{#VEEAMJOBKEY}] -veeam.job.next_run[{#VEEAMJOBKEY}] -veeam.job.result[{#VEEAMJOBKEY}] -veeam.job.restore_points[{#VEEAMJOBKEY}] -veeam.job.summary[{#VEEAMJOBKEY}] +Data collection -> Templates -> Import ``` -`{#VEEAMJOBNAME}` is stored as a tag named `veeam_job`, so Zabbix views and -dashboard widgets can group or filter the discovered items by job name. The -legacy `veeam.jobs.table` item remains available as a quick text overview, but -the discovered items are the preferred way to build a dashboard. +Импортируй файл: -If dashboard widgets cannot render discovered items as a table, use this single -aggregate item instead: +```text +zabbix-templete-veeam-jobs.xml +``` + +При повторном импорте включи обновление существующих объектов, чтобы обновились +items, triggers и discovery rule. + +После импорта привяжи шаблон: + +```text +Veeam Backup Jobs +``` + +к host, на котором установлен Zabbix Agent 2 и лежит `Monitor-VeeamJobs.ps1`. + +## Основные items + +| Item | Key | Описание | +| --- | --- | --- | +| Veeam: Monitor | `veeam.scripts.monitor` | Master item. Сырой JSON от скрипта. | +| Veeam: Total jobs | `veeam.jobs.total` | Всего заданий Veeam. | +| Veeam: Successful jobs | `veeam.jobs.successful` | Задания, последняя сессия которых завершилась успешно. | +| Veeam: Disabled jobs | `veeam.jobs.disabled` | Выключенные задания после применения исключений. | +| Veeam: Error jobs | `veeam.jobs.error` | Задания с последним результатом `Failed`. | +| Veeam: Warning jobs | `veeam.jobs.warning` | Задания с последним результатом `Warning`. | +| Veeam: Disabled job names | `veeam.jobs.disabled.names` | Имена выключенных заданий после исключений. | +| Veeam: Excluded disabled job names | `veeam.jobs.disabled.excluded.names` | Выключенные задания, которые попали в исключения. | +| Veeam: Error job names | `veeam.jobs.error.names` | Имена заданий с ошибками. | +| Veeam: Warning job names | `veeam.jobs.warning.names` | Имена заданий с предупреждениями. | +| Veeam: Job details table | `veeam.jobs.table` | Текстовая таблица всех заданий. | +| Veeam: Jobs summary | `veeam.jobs.summary` | Многострочная сводка всех заданий для dashboard. | + +## Discovered items по каждому заданию + +Шаблон содержит low-level discovery rule: + +```text +Veeam: Job discovery +key: veeam.jobs.discovery +``` + +Она создает items по каждому найденному заданию: + +| Prototype | Key | +| --- | --- | +| Veeam job `[JOB_NAME]`: Enabled | `veeam.job.enabled[{#VEEAMJOBKEY}]` | +| Veeam job `[JOB_NAME]`: Last run | `veeam.job.last_run[{#VEEAMJOBKEY}]` | +| Veeam job `[JOB_NAME]`: Next run | `veeam.job.next_run[{#VEEAMJOBKEY}]` | +| Veeam job `[JOB_NAME]`: Result | `veeam.job.result[{#VEEAMJOBKEY}]` | +| Veeam job `[JOB_NAME]`: Restore points | `veeam.job.restore_points[{#VEEAMJOBKEY}]` | +| Veeam job `[JOB_NAME]`: Summary | `veeam.job.summary[{#VEEAMJOBKEY}]` | + +`{#VEEAMJOBKEY}` - это безопасный ключ, сформированный из имени задания. Он нужен, +чтобы в item key не ломались пробелы, слеши и спецсимволы. + +`{#VEEAMJOBNAME}` сохраняется в имени item-а и в теге: + +```text +veeam_job +``` + +## Исключения для выключенных заданий + +Если часть заданий специально выключена, их можно исключить из счетчика +`veeam.jobs.disabled`. + +По умолчанию скрипт ищет файл: + +```text +C:\Program Files\Zabbix Agent 2\scripts\NotifyOfDisabledJobs_EXCLUSIONS.IN +``` + +Формат файла простой: одна строка - один фрагмент имени задания. + +Пример: + +```text +D_Migratio_DRP +Test policy +Archive +``` + +Если имя выключенного задания содержит один из этих фрагментов, оно попадет в: + +```text +veeam.jobs.disabled.excluded.names +``` + +и не будет учитываться в: + +```text +veeam.jobs.disabled +veeam.jobs.disabled.names +``` + +## Триггеры + +В шаблоне есть триггеры: + +| Триггер | Условие | Severity | +| --- | --- | --- | +| Disabled Veeam jobs detected | `veeam.jobs.disabled > 0` и есть имена выключенных заданий | High | +| More than 5 Veeam jobs in error state | `veeam.jobs.error > 5` и есть имена заданий с ошибкой | High | +| Veeam jobs in warning state | `veeam.jobs.warning > 0` и есть имена заданий с warning | Warning | + +Логика `disabled.excluded.names` оставлена специально: она нужна для окружений, +где есть много намеренно выключенных политик. + +## Dashboard в Zabbix 7.0 + +Самый надежный вариант для dashboard - использовать агрегированные items. + +Рекомендуемая структура: + +| Зона | Виджет | Item | +| --- | --- | --- | +| Верхняя строка | Item value | `veeam.jobs.total` | +| Верхняя строка | Item value | `veeam.jobs.successful` | +| Верхняя строка | Item value | `veeam.jobs.disabled` | +| Верхняя строка | Item value | `veeam.jobs.error` | +| Верхняя строка | Item value | `veeam.jobs.warning` | +| Центр | Item value или Item history | `veeam.jobs.summary` | +| Низ | Item value или Item history | `veeam.jobs.error.names` | +| Низ | Item value или Item history | `veeam.jobs.warning.names` | +| Низ | Item value или Item history | `veeam.jobs.disabled.names` | + +Для просмотра всех заданий одной строкой на задание используй: ```text Veeam: Jobs summary veeam.jobs.summary ``` -It contains all jobs in one multiline value and is the most compatible dashboard -option for Zabbix 7.0. - -For a compact dashboard list, use the discovered summary item: +Пример значения: ```text -Veeam job [JOB_NAME]: Summary +Job | Enabled | Last run | Next run | Result | Restore points +vnamztr004 | yes | 2026-07-16 01:00:00 | - | Success | 19 +D_Migratio_DRP | no | - | - | - | - ``` -It displays one line per job: +Discovered items тоже остаются доступными и удобны для `Latest data`, но для +dashboard в Zabbix 7.0 проще и стабильнее использовать `veeam.jobs.summary`. + +## Режим Sender + +По умолчанию скрипт работает в режиме `Json`, который нужен для UserParameter. +Это основной рекомендуемый вариант. + +Также есть режим `Sender`: + +```powershell +powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix Agent 2\scripts\Monitor-VeeamJobs.ps1" -Mode Sender +``` + +Он отправляет метрики через `zabbix_sender.exe`. Этот режим полезен для запуска +из Task Scheduler, но текущий шаблон в первую очередь рассчитан на +`ZABBIX_PASSIVE` master item `veeam.scripts.monitor`. + +Для обычной установки через Zabbix Agent 2 используй `UserParameter`, а не +`-Mode Sender`. + +## Проверка после установки + +1. Проверить скрипт напрямую: + +```powershell +powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix Agent 2\scripts\Monitor-VeeamJobs.ps1" +``` + +2. Проверить через агент: + +```cmd +"C:\Program Files\Zabbix Agent 2\zabbix_agent2.exe" -t veeam.scripts.monitor +``` + +3. Проверить master item в Zabbix: ```text -Enabled: yes | Last: 2026-07-16 01:00:00 | Next: - | Result: Success | Restore points: 14 +Monitoring -> Latest data -> Veeam: Monitor ``` -## Zabbix dashboard idea +4. Проверить dependent items: -Create a dashboard named `Veeam Jobs` for hosts linked to the `Veeam Backup Jobs` -template. +```text +Monitoring -> Latest data -> veeam.jobs +``` -Suggested widgets: +5. Проверить discovery: -| Area | Widget | Items | -| --- | --- | --- | -| Top row | Item value | `veeam.jobs.total` | -| Top row | Item value | `veeam.jobs.successful` | -| Top row | Item value | `veeam.jobs.disabled` | -| Top row | Item value | `veeam.jobs.error` | -| Top row | Item value | `veeam.jobs.warning` | -| Middle | Item value or item history | `veeam.jobs.summary` | -| Bottom left | Item value or item list | `veeam.jobs.error.names` | -| Bottom center | Item value or item list | `veeam.jobs.warning.names` | -| Bottom right | Item value or item list | `veeam.jobs.disabled.names` | +```text +Data collection -> Hosts -> Veeam host -> Discovery -> Veeam: Job discovery +``` -Use a red threshold for `veeam.jobs.error`, yellow for `veeam.jobs.warning`, and -keep `veeam.jobs.disabled` aligned with the existing exclusion policy. The -template intentionally keeps `veeam.jobs.disabled.excluded.names`, because some -disabled policies are expected. +## Типовые проблемы -## Email notification script +### Скрипт работает вручную, но в Zabbix нет данных -`NotifyOfDisabledJobs.ps1` sends an email if one or more Veeam jobs are disabled. -To exclude expected disabled jobs, add keywords to: +Проверь через агент: + +```cmd +"C:\Program Files\Zabbix Agent 2\zabbix_agent2.exe" -t veeam.scripts.monitor +``` + +Если есть timeout, увеличь в `zabbix_agent2.conf`: + +```ini +Timeout=30 +``` + +и перезапусти агент. + +### Вручную работает, через агент ошибка доступа к Veeam + +Ручной запуск идет от твоего пользователя, а Zabbix Agent 2 работает от учетной +записи службы. У этой учетной записи должен быть доступ к Veeam PowerShell. + +Проверь лог: + +```text +C:\Program Files\Zabbix Agent 2\zabbix_agent2.log +``` + +### Нет successful jobs + +Скрипт сначала пытается читать результат из свойств job, затем из последней +Veeam-сессии. Если `successful` равен `0`, проверь в JSON поля: + +```text +last_result +last_state +result +``` + +Если они пустые для всех заданий, значит текущий тип заданий Veeam не отдает +последний результат стандартными методами. + +### Не показывается таблица в dashboard + +В Zabbix 7.0 не все виджеты хорошо показывают много discovered items как таблицу. +Самый простой вариант - выводить один item: + +```text +Veeam: Jobs summary +``` + +или смотреть подробности в: + +```text +Monitoring -> Latest data +``` + +## Старый email-скрипт + +`NotifyOfDisabledJobs.ps1` оставлен в репозитории как старый вариант +email-уведомлений. Он не нужен для работы Zabbix-шаблона. + +Если он все еще используется отдельно, исключения задаются так же через файл: ```text C:\Scripts\Veeam\NotifyOfDisabledJobs_EXCLUSIONS.IN ``` -Example exclusions: +Пример: ```text Backup_FILE01 @@ -144,11 +428,8 @@ Backup_FILE47 Replication_FILE ``` -Example batch launch: +Запуск старого скрипта: ```bat powershell.exe c:\scripts\Veeam\NotifyOfDisabledJobs.ps1 ``` - -The original workflow runs this check every four hours, so intentionally disabled -jobs can be excluded while unexpected disabled jobs still raise a notification.