436 lines
15 KiB
Markdown
436 lines
15 KiB
Markdown
# Мониторинг 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
|
||
```
|