Expand Russian setup documentation
This commit is contained in:
435
README.md
435
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.
|
||||
|
||||
Reference in New Issue
Block a user