# Мониторинг Veeam Backup Jobs в Zabbix 7.0 Репозиторий содержит готовый сборщик состояния заданий Veeam Backup & Replication и шаблон Zabbix 7.0. ## Что входит в проект | Файл | Назначение | | --- | --- | | `Monitor-VeeamJobs.ps1` | Основной скрипт для Zabbix. Собирает задания Veeam и отдает JSON. | | `zabbix-templete-veeam-jobs.xml` | Шаблон Zabbix 7.0 с item-ами, discovery и триггерами. | | `NotifyOfDisabledJobs.ps1` | Старый отдельный скрипт email-уведомлений о выключенных заданиях. Для Zabbix не нужен. | Для мониторинга через 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": 49, "disabled": 0, "successful": 45, "error": 1, "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\n...", "jobs_lld": { "data": [ { "{#VEEAMJOBKEY}": "dm5hbXp0cjAwNA", "{#VEEAMJOBNAME}": "vnamztr004" } ] }, "jobs": [ { "key": "dm5hbXp0cjAwNA", "name": "vnamztr004", "enabled": true, "enabled_numeric": 1, "enabled_text": "yes", "last_run": "2026-07-16 01:00:00", "next_run": "-", "last_result": "Success", "last_state": "Stopped", "result": "Success", "restore_points": 19, "restore_points_text": "19", "summary": "Enabled: yes | Last: 2026-07-16 01:00:00 | Next: - | Result: Success | Restore points: 19" } ] } ``` ## Настройка Zabbix Agent 2 В файл конфигурации агента: ```text C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf ``` добавь строку: ```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 Data collection -> Templates -> Import ``` Импортируй файл: ```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 ``` Пример значения: ```text Job | Enabled | Last run | Next run | Result | Restore points vnamztr004 | yes | 2026-07-16 01:00:00 | - | Success | 19 D_Migratio_DRP | no | - | - | - | - ``` 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 Monitoring -> Latest data -> Veeam: Monitor ``` 4. Проверить dependent items: ```text Monitoring -> Latest data -> veeam.jobs ``` 5. Проверить discovery: ```text Data collection -> Hosts -> Veeam host -> Discovery -> Veeam: Job discovery ``` ## Типовые проблемы ### Скрипт работает вручную, но в Zabbix нет данных Проверь через агент: ```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 ``` Пример: ```text Backup_FILE01 Backup_FILE47 Replication_FILE ``` Запуск старого скрипта: ```bat powershell.exe c:\scripts\Veeam\NotifyOfDisabledJobs.ps1 ```