Будем считать, что сервер Zabbix 3.0.4 у нас установлен. Для скриптов установки агента будем использовать, по хардкору, только родную командную строку Windows, без питонов, перлов и т.п., т.е. без дополнительных инсталляций в систему агента. Шифрование настроим с помощью PSK.
Постановка задачи:
1) Упростить установку агентов на системы Windows
2) Настроить шифрование между агентом и сервером.
3) Настроить обнаружение дисков (имена, модели, серийные номера, типы) c помощью утилиты smartmontools, контроль S.M.A.R.T.
4) Создать масштабируемый шаблон сценария развёртывания.
5) Настроить оповещение.
6) Использовать только командную строку.
Агенты Windows почему-то ещё не имеют поддержку TLS, но есть скомпилированные версии, которые можно скачать отсюда. Обсуждение.
Распаковываем. Нам понадобится только каталог bin. Дефолтный конфиг нам не понадобится.
Создаём каталог zabbix и копируем в него каталог bin из распакованного агента. Далее создаём в каталоге zabbix подкаталоги conf, disks, logs, psk, scripts, smartmontools. Сразу примем решение что размещать папку zabbix мы будем в корне тома C:\
![](https://habrastorage.org/r/w1560/files/333/638/41a/33363841a56d44feabae3ea21294504c.png)
Сразу подготовим PSK ключи и файл данных. Создаём на сервере файл pskgen4ik:
Сохраняем, делаем исполняемым (chmod +x ), запускаем, и копируем результат в файл данных, я приведу пример Excel для наглядности. Можно использовать и базу данных. Что-то типа этого:
![](https://habrastorage.org/r/w1560/files/77a/2f5/828/77a2f582883c4889967cdac743e08724.png)
Поле Host name мы заполним после создания конфига агента (если конечно же нет уже составленного списка). Придумываем и дописываем уникальные идентификаторы PSK ID. Сохраняем файл данных, делаем бэкап, строго ограничиваем к нему доступ и удаляем файл «agent_psk». Всё у нас есть файл данных с ключами и идентификаторами, которые будем использовать.
Для получения информации о дисках и их S.M.A.R.T используем утилиту Smartmontools. Я беру последнюю версию 6.5. В этой версии нормально определяются паспорта USB, и новые манифесты для 10ки. Обо всех исправлениях в релизе.
Скачиваем и кидаем в папку zabbix\smartmontools
Смотрим список подключенных дисков:
![](https://habrastorage.org/r/w1560/files/f99/922/091/f99922091f70431db352f938d63b5171.png)
Ключ –d указывает на тип диска.
Заинтересуемся диском /dev/sda. Пока он мало о чём говорит кроме того, что он ATA-типа и скорей всего загрузочный.
Смотрим информацию о нём:
![](https://habrastorage.org/r/w1560/files/318/b74/1de/318b741dee974dcbb0046982dee37804.png)
Уже интересней. Как видно СМАРТ отключён. Включаем его:
Смотрим таблицу атрибутов S.M.A.R.T.
![](https://habrastorage.org/r/w1560/files/90f/a72/bb0/90fa72bb031a4ebc9e509bd4a5c2bf71.png)
Таблицу смарт у RAID посмотреть не получится, но статус health получить сможем.
Смотрим SMART Health:
![](https://habrastorage.org/r/w1560/files/5be/590/4ea/5be5904ea53548eda587284d5f611110.png)
Теперь то же самое нужно сделать для остальных 1000 дисков ) Создавать для каждого шаблоны уже не может быть и речи, более того мне, например, ещё нужно получать модель и серийник каждого диска в отчёте. На помощь приходит Zabbix LLD.
Поскольку Zabbix имеет возможность обработки данных по протоколу JSON, предоставленной его API, мы будем генерить нужную информацию из smartmontools в JSON формат и пассивно передавать на сервер.
Начинаем создавать сценарии. Для начала придумаем макросы обнаружения и определимся с данными:
Создаём в каталоге zabbix\scripts файл DiskInfoGenerationJSON.cmd следующего содержания:
Сохраняем DiskInfoGenerationJSON.cmd
Мне не удалось упрощённо решить проблему последней запятой с помощью cmd (да я и не начинал её решать, ибо это бред сумасшедшего), в строке…
… которая нарушает синтаксис JSON. Поэтому я просто добавил строчку {"{#SMARTV}":«Smartctl 6.5»}, которая закрывает тело без запятой.
При запуске файла DiskInfoGenerationJSON.cmd. В итоге мы должны получить файл c:\zabbix\disks\disks.cmd со следующим содержимым:
![](https://habrastorage.org/r/w1560/files/2f7/73b/a65/2f773ba656cb4390af53bb796cb6f2b3.png)
Создаём в каталоге zabbix\scripts файл GetSmartAllDisk.cmd следующего содерания:
Сохраняем GetSmartAllDisk.cmd
Генерация будет разбита на две части: настройки подключения и пользовательские параметры.
Анализируем будущий конфигурационный файл агента:
Уникальными для каждого хоста тут являются поля Hostname= и TLSPSKIdentity= в конфигурационном файле. А также pre-shared ключ в файле zabbix\psk\Z_agent.psk. Следовательно, определим эти значения в переменные.
В каталоге zabbix\scripts создаём файл AgentConfigGeneration.cmd:
Всё просто. При запуске вводим название организации, например, Organization1 и получаем Hostname в конфиге в виде «Organization1.Имя_хоста». В пределах сети одной организации как правило исключается использование одинаковых имён узлов, поэтому мы будем иметь уникальные имена. Далее вводим PSK ID из ранее составленного файла данных и ключ. Но пока мы ничего не запускаем.
В каталоге zabbix\scripts создаём файл UserParameters.txt, который будет содержать пользовательские параметры (UserParameter=<ключ>,<shell команда>)
Сохраняем UserParameters.txt. Мы придумали ключи и циклы для получения данных. И в конец файла AgentConfigGeneration.cmd добавляем следующую строчку:
Нам ещё нужно открыть порт на узле, если брандмауэр включён. Создаём файл OpenLocalPort.cmd
Итак, сценарии мы написали. Вот что у нас получается:
Теперь нужно определиться в очерёдности запусков этого добра:
1) Ввод переменных
2) Установка smartmontools в тихом режиме
3) Установка службы Zabbix Agent
4) Генерация конфига с пользовательскими параметрами — AgentConfigGeneration.cmd
5) Генерация списка дисков — DiskInfoGenerationJSON.cmd
6) Включение S.M.A.R.T. — GetSmartAllDisk.cmd.cmd
7) Открыть порт — OpenLocalPort.cmd
8) Запуск службы Zabbix Agent
Создаём в корне каталога zabbix файл INSTALL_AGENT.cmd и объединяем в нём все шаги наших сценариев:
Упаковываем каталог zabbix в SFX-архив и шифруем паролем при необходимости
Имеем сервер в организации «Организация 1». Помещаем zabbix.exe на сервер и распаковываем в корень тома C:\
Запускаем INSTALL_AGENT.cmd от имени Администратора. Вводим без пробелов название Организации, копируем из файла данных идентификатор PSK и ключ:
![](https://habrastorage.org/r/w1560/files/801/8a4/b0d/8018a4b0d95747ba92b4bb18c6aeaea9.png)
Enter:
![](https://habrastorage.org/r/w1560/files/b5a/7ed/ccd/b5a7edccda044fe2b379708444bd78ca.png)
Проверяем файл логов C:\zabbix\logs\logs.log:
![](https://habrastorage.org/r/w1560/files/f35/9d2/0a8/f359d20a80c04842a40f815249af2356.png)
Копируем Hostname “Organization1.SUNSET” в файл данных:
![](https://habrastorage.org/r/w1560/files/b37/281/90f/b3728190f90a42eeba1b873e062944b7.png)
И так далее с каждым хостом. После заполнения файла заходим в кабинет Zabbix — 10.3.10.1/zabbix — и добавляем из него группы, узлы. В настройках шифрования узла отмечаем PSK и ждём онлайна.
![](https://habrastorage.org/r/w1560/files/289/e4a/e58/289e4ae58538410e99f98fec48a32338.png)
![](https://habrastorage.org/r/w1560/files/2a4/8be/1e3/2a48be1e3fd843c994773686eac365cd.png)
Ждём несколько секунд:
![](https://habrastorage.org/r/w1560/files/3ca/03c/567/3ca03c5675d14ef6a13063c394ccf2ba.png)
О шифровании и об ограничениях
Русифицирую кабинет для разнообразия )
Создаём Шаблон S.M.A.R.T. и группы элементов данных. Для примера я создал следующие группы по атрибутам смарта:
![](https://habrastorage.org/r/w1560/files/659/0cd/8f8/6590cd8f85d44c45ad346904daf7d569.png)
Выбираем «Правила обнаружения» и создаём правило:
![](https://habrastorage.org/r/w1560/files/abb/aba/9c1/abbaba9c132c44f3aa92b1040e4f1306.png)
В поле «Ключ» указываем тот самый придуманный нами пользовательский параметр из файла C:\zabbix\scripts\UserParameters.txt
А во вкладке «Фильтры» пишем наши макросы из созданного файла c:\zabbix\disks\disks.cmd и жмём «Добавить»
![](https://habrastorage.org/r/w1560/files/6e8/620/97c/6e862097c09447d9a9d1aea5351242e3.png)
![](https://habrastorage.org/r/w1560/files/c26/6d5/3f3/c266d53f3e954d0f8805af9c475b2362.png)
Я создам для примера два прототипа атрибута Spin_Retry_Count и добавлю в группу элементов данных Pre-fail: Spin_Retry_Count. Первый будет получать VALUE значение, второй THRESHOLD из таблицы атрибутов смарт для каждого обнаруженного диска
Обратимся ещё раз к файлу C:\zabbix\scripts\UserParameters.txt (ну или уже созданному конфигу). И посмотрим какие циклы у нас вытаскивают нужные нам данные:
Как видно из скрипта для ключей HDD.value.[*] и HDD.thresh.[*] нам нужно на вход три аргумента $1 – диск (/dev/*), $2 – тип диска (ata,sat и т.д.), $3 – атрибут (в нашем случае Spin_Retry_Count). В итоге ключ получит такой формат HDD.value.[$1,$2,$3]. Например для нашего диска /dev/sda типа «ata», будет так HDD.value.[/dev/sda,ata,Spin_Retry_Count]. Но поскольку мы создали макросы для каждого обнаруженного диска, формат ключа в прототипе элемента данных будет таков HDD.value.[{#DISKPORT},{#DISKTYPE},Spin_Retry_Count]. Этот ключ будет перебирать каждый диск по данному атрибуту.
Кстати, можем проверить ключ с сервера, c помощью zabbix_get
![](https://habrastorage.org/r/w1560/files/74f/0e2/85d/74f0e285de8f4423b1d9a4f254ac811e.png)
И также для Threshold:
![](https://habrastorage.org/r/w1560/files/5b3/fde/c03/5b3fdec0388e4028b1c345232d588b52.png)
Итак, создаём наш прототип данных для VALUE и используем пассивную проверку:
![](https://habrastorage.org/r/w1560/files/b11/00a/369/b1100a3691cd481cab8de6f08f0db1bb.png)
Аналогично создаём прототип для Threshold. В итоге имеем:
![](https://habrastorage.org/r/w1560/files/929/074/8a6/9290748a6dd040f29c79e26d9883c7f7.png)
Создаём «Прототип триггера». Даём имя, например, для наглядности:
S.M.A.R.T.: ВНИМАНИЕ! Диск {#DISKMODEL} ( {#DISKPORT} — {#DISKTYPE} ). Ожидается сбой и\или полный отказ диска в ближайшие 24 часа! Значение атрибута хуже критического порога
В «Поле выражение» пишем условие:
Смысл в том, что если Value меньше Threshold — нужно выдать проблему. Last() – показывает последнее полученное значение (подробней о функициях). В поле «Описание» пишем, например:
Важность ставим «Чрезвычайная»
![](https://habrastorage.org/r/w1560/files/c52/382/5e3/c523825e38bd4ac38da888928c245c25.png)
Будем считать, что оповещение у нас настроено по EMAIL. Если нет, то сюда.
Идём в «Настройка» > «Действия». Создаём форму репорта. Жмём «Создать действие»
Имя: Отчёты о проблемах
Тема по умолчанию: ПРОБЛЕМА! [ {HOST.NAME} ] — {TRIGGER.NAME} ({EVENT.ID})
Сообщение по умолчанию:
Заполняем сообщение о восстановлении:
Тема восстановления: ОК. [ {HOST.NAME} ]
Сообщение о восстановлении:
Включим «Активировать»
Переходим на вкладку «Условия» и заполняем как показано ниже:
![](https://habrastorage.org/r/w1560/files/143/84b/502/14384b5029ae46b18edca7f8b1abba34.png)
Я указал только «Чрезвычайные» проблемы для примера. Условия можно задавать какие душе угодно.
Переходим во вкладку «Операции» и добавляем либо группу нашего пользователя, либо указываем только себя. Тут в принципе комментировать нечего.
![](https://habrastorage.org/r/w1560/files/339/486/8f4/3394868f41de4134a5701372941c29bb.png)
Теперь я сымитирую сбой. У меня например вcе атрибуты впорядке, поэтому я изменю значение в триггере и поставлю «больше нуля»
Арифметику думаю объяснять не нужно.
Ждём некоторое время и получаем проблему:
![](https://habrastorage.org/r/w1560/files/4dc/9fd/5e1/4dc9fd5e106a4b35a5ab91296964566d.png)
И спустя пару секунд приходит сообщение на почту:
![](https://habrastorage.org/r/w1560/files/f44/8ce/068/f448ce0681924f9d8a9391a40d2b5eed.png)
После восстановления получим следующее сообщение:
![](https://habrastorage.org/r/w1560/files/7fe/7ef/dba/7fe7efdba87d4604a161c10fd26131cb.png)
Если есть ошибки, или что-то можно делать проще, пожалуйста сообщите! Писал тему пару часов со скринами, вроде дважды проверил на удачно.
Скачать готовый шаблон
PS: Особенного огонь когда zabbix отсылает поставщику сообщение с просьбой выставить счёт на новый диск или, например, когда заканчивается тонер в принтере кидает саппорту тикет на заправку картриджа, но это уже другая история…
Внешний IP Zabbix сервера пусть будет — 30.0.1.1
Локальный IP Zabbix сервера – 10.3.10.1
Адрес тестового узла – 30.0.1.3
По форвардинг портов тут говориться не будет. Узел в примере будет слушать 10050, сервер – 10051.
Постановка задачи:
1) Упростить установку агентов на системы Windows
2) Настроить шифрование между агентом и сервером.
3) Настроить обнаружение дисков (имена, модели, серийные номера, типы) c помощью утилиты smartmontools, контроль S.M.A.R.T.
4) Создать масштабируемый шаблон сценария развёртывания.
5) Настроить оповещение.
6) Использовать только командную строку.
Агенты Windows почему-то ещё не имеют поддержку TLS, но есть скомпилированные версии, которые можно скачать отсюда. Обсуждение.
Распаковываем. Нам понадобится только каталог bin. Дефолтный конфиг нам не понадобится.
Создаём каталог zabbix и копируем в него каталог bin из распакованного агента. Далее создаём в каталоге zabbix подкаталоги conf, disks, logs, psk, scripts, smartmontools. Сразу примем решение что размещать папку zabbix мы будем в корне тома C:\
![](https://habrastorage.org/files/333/638/41a/33363841a56d44feabae3ea21294504c.png)
conf – тут будет файл конфига
disks – сюда будет генерироваться информация о дисках в JSON
logs – логи
pks – тут будет лежать файл Z_agent.psk содержащий pre-shared ключ
scripts – скрипты
smartmontools – сюда помещаем одноимённую программу S.M.A.R.T.
Сразу подготовим PSK ключи и файл данных. Создаём на сервере файл pskgen4ik:
#!/bin/bash
echo -n "Сколько ключей нужно? : "
read LIMIT
a=1
echo \# > /home/appliance/agent_psk
while [ "$a" -le $LIMIT ]
do
openssl rand -hex 64 >> /home/appliance/agent_psk
let "a++"
done
less /home/appliance/agent_psk
Сохраняем, делаем исполняемым (chmod +x ), запускаем, и копируем результат в файл данных, я приведу пример Excel для наглядности. Можно использовать и базу данных. Что-то типа этого:
![](https://habrastorage.org/files/77a/2f5/828/77a2f582883c4889967cdac743e08724.png)
Поле Host name мы заполним после создания конфига агента (если конечно же нет уже составленного списка). Придумываем и дописываем уникальные идентификаторы PSK ID. Сохраняем файл данных, делаем бэкап, строго ограничиваем к нему доступ и удаляем файл «agent_psk». Всё у нас есть файл данных с ключами и идентификаторами, которые будем использовать.
S.M.A.R.T.
Для получения информации о дисках и их S.M.A.R.T используем утилиту Smartmontools. Я беру последнюю версию 6.5. В этой версии нормально определяются паспорта USB, и новые манифесты для 10ки. Обо всех исправлениях в релизе.
Скачиваем и кидаем в папку zabbix\smartmontools
Знакомство с утилитой.
Смотрим список подключенных дисков:
c:\>"Program Files"\smartmontools\bin\smartctl.exe --scan
![](https://habrastorage.org/files/f99/922/091/f99922091f70431db352f938d63b5171.png)
Ключ –d указывает на тип диска.
Заинтересуемся диском /dev/sda. Пока он мало о чём говорит кроме того, что он ATA-типа и скорей всего загрузочный.
Смотрим информацию о нём:
c:\>"Program Files"\smartmontools\bin\smartctl.exe -i /dev/sda -d ata
![](https://habrastorage.org/files/318/b74/1de/318b741dee974dcbb0046982dee37804.png)
Уже интересней. Как видно СМАРТ отключён. Включаем его:
c:\>"Program Files\smartmontools\bin\smartctl.exe" --smart=on --offlineauto=on --saveauto=on /dev/sda
Смотрим таблицу атрибутов S.M.A.R.T.
c:\>"Program Files"\smartmontools\bin\smartctl.exe -A /dev/sda -d ata
![](https://habrastorage.org/files/90f/a72/bb0/90fa72bb031a4ebc9e509bd4a5c2bf71.png)
Таблицу смарт у RAID посмотреть не получится, но статус health получить сможем.
Смотрим SMART Health:
c:\>"Program Files"\smartmontools\bin\smartctl.exe -H /dev/sda -d ata
![](https://habrastorage.org/files/5be/590/4ea/5be5904ea53548eda587284d5f611110.png)
Теперь то же самое нужно сделать для остальных 1000 дисков ) Создавать для каждого шаблоны уже не может быть и речи, более того мне, например, ещё нужно получать модель и серийник каждого диска в отчёте. На помощь приходит Zabbix LLD.
Поскольку Zabbix имеет возможность обработки данных по протоколу JSON, предоставленной его API, мы будем генерить нужную информацию из smartmontools в JSON формат и пассивно передавать на сервер.
Начинаем создавать сценарии. Для начала придумаем макросы обнаружения и определимся с данными:
Макрос {#DISKPORT} — имя диска в системе (/dev/sda, /dev/sdb и т.д.),
Макрос {#DISKTYPE} — тип диска (ata,scsi,sat, csmi и т.д.),
Макрос {#DISKMODEL} – модель диска,
Макрос {#DISKSN} — серийный номер.
Создаём в каталоге zabbix\scripts файл DiskInfoGenerationJSON.cmd следующего содержания:
@echo off
echo @echo off > c:\zabbix\disks\disks.cmd
echo echo {"data": >> c:\zabbix\disks\disks.cmd
echo echo [ >> c:\zabbix\disks\disks.cmd
for /F "tokens=1,3" %%a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe --scan') ^
do (for %%s in ("Device Model" "Product") ^
do (for /F "tokens=2*" %%c in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -i %%a -d %%b ^| find %%s ') ^
do (for %%i in ("Serial Number") do (for /F "tokens=3*" %%k in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -i %%a -d %%b ^| find %%i ') ^
do echo echo {"{#DISKPORT}":"%%a","{#DISKTYPE}":"%%b","{#DISKMODEL}":"%%d","{#DISKSN}":"%%k"},>> c:\zabbix\disks\disks.cmd))))
echo echo {"{#SMARTV}":"Smartctl 6.5"}>> c:\zabbix\disks\disks.cmd
echo echo ] >> c:\zabbix\disks\disks.cmd
echo echo } >> c:\zabbix\disks\disks.cmd
Сохраняем DiskInfoGenerationJSON.cmd
Мне не удалось упрощённо решить проблему последней запятой с помощью cmd (да я и не начинал её решать, ибо это бред сумасшедшего), в строке…
{"{#DISKPORT}":"%%a","{#DISKTYPE}":"%%b","{#DISKMODEL}":"%%d","{#DISKSN}":"%%k"},
… которая нарушает синтаксис JSON. Поэтому я просто добавил строчку {"{#SMARTV}":«Smartctl 6.5»}, которая закрывает тело без запятой.
При запуске файла DiskInfoGenerationJSON.cmd. В итоге мы должны получить файл c:\zabbix\disks\disks.cmd со следующим содержимым:
![](https://habrastorage.org/files/2f7/73b/a65/2f773ba656cb4390af53bb796cb6f2b3.png)
Создаём в каталоге zabbix\scripts файл GetSmartAllDisk.cmd следующего содерания:
rem включаем СМАРТ у всех дисков которые это позволят:
for /F "tokens=1" %%a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe --scan') ^
do "C:\Program Files\smartmontools\bin\smartctl.exe" --smart=on --offlineauto=on --saveauto=on %%a
Сохраняем GetSmartAllDisk.cmd
Генерации конфига
Генерация будет разбита на две части: настройки подключения и пользовательские параметры.
Создание конфига
Анализируем будущий конфигурационный файл агента:
LogFile=C:\zabbix\logs\logs.log # журнал логов
LogFileSize=100 # ограничение размера файла логов
Server=30.0.1.1 # сервер пассивных проверок
ServerActive=30.0.1.1 # сервер активных проверок
StartAgents=3 # кол-во пре-форков
Timeout=30 # не более 30 сек на обработку
Hostname= # уникальное имя хоста
# TLS
TLSConnect=psk # тип исходящих подключений (активная проверка)
TLSAccept=psk # тип входящих подключений (пассивная проверка)
TLSPSKFile=C:\zabbix\psk\Z_agent.psk # путь к файлу с pre-shared ключом
TLSPSKIdentity= # уникальный идентификатор
Уникальными для каждого хоста тут являются поля Hostname= и TLSPSKIdentity= в конфигурационном файле. А также pre-shared ключ в файле zabbix\psk\Z_agent.psk. Следовательно, определим эти значения в переменные.
В каталоге zabbix\scripts создаём файл AgentConfigGeneration.cmd:
@echo off
chcp 866 > nul
set /P CLIENT="Enter Organization name: "
set /P PSKID=" Enter PSKIdentity: "
set /P PSKkey="Enter PSKkey: "
rem Генерация конфига
@echo # zabbix_agent 3.0.1> C:\zabbix\conf\zabbix_agentd.conf
@echo. >>C:\zabbix\conf\zabbix_agentd.conf
@echo %PSKkey%>>C:\zabbix\psk\Z_agent.psk
@echo LogFile=C:\zabbix\logs\logs.log >> C:\zabbix\conf\zabbix_agentd.conf
@echo LogFileSize=100 >> C:\zabbix\conf\zabbix_agentd.conf
@echo Server=30.0.1.1 >> C:\zabbix\conf\zabbix_agentd.conf
@echo ServerActive=30.0.1.1 >> C:\zabbix\conf\zabbix_agentd.conf
@echo StartAgents=3 >> C:\zabbix\conf\zabbix_agentd.conf
@echo Timeout=30 >> C:\zabbix\conf\zabbix_agentd.conf
@echo Hostname=%CLIENT%.%COMPUTERNAME%>> C:\zabbix\conf\zabbix_agentd.conf
@echo. >> C:\zabbix\conf\zabbix_agentd.conf
@echo ##### TLS ###########>> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSConnect=psk>> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSAccept=psk>> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSPSKFile=C:\zabbix\psk\Z_agent.psk>> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSPSKIdentity=%PSKID%>> C:\zabbix\conf\zabbix_agentd.conf
@echo. >> C:\zabbix\conf\zabbix_agentd.conf
Всё просто. При запуске вводим название организации, например, Organization1 и получаем Hostname в конфиге в виде «Organization1.Имя_хоста». В пределах сети одной организации как правило исключается использование одинаковых имён узлов, поэтому мы будем иметь уникальные имена. Далее вводим PSK ID из ранее составленного файла данных и ключ. Но пока мы ничего не запускаем.
Добавление в конфиг пользовательских параметров
В каталоге zabbix\scripts создаём файл UserParameters.txt, который будет содержать пользовательские параметры (UserParameter=<ключ>,<shell команда>)
##### Обнаружение дисков.
UserParameter=HDD.discovery,for /F "tokens=*" %a in ('C:\zabbix\disks\disks.cmd') do @echo %a
##### S.M.A.R.T.
# RAW_VALUE
UserParameter=HDD.raw[*], for /F "tokens=10" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 -d $2 ^| find "$3"') do @echo %a
# VALUE
UserParameter=HDD.value.[*], for /F "tokens=4" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 -d $2^| find "$3"') do @echo %a
# WORST
UserParameter=HDD.worst.[*], for /F "tokens=5" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 -d $2 ^| find "$3"') do @echo %a
# THRESOLD
UserParameter=HDD.thresh.[*], for /F "tokens=6" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 -d $2 ^| find "$3"') do @echo %a
# WHEN_FAILED
UserParameter=HDD.when.failed.[*], for /F "tokens=9" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 -d $2 ^| find "$3"') do @echo %a
# HEALTH Status
UserParameter=HDD.health.[*], for /F "tokens=6" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -H $1 -d $2 ^| find "test"') do @echo %a
Сохраняем UserParameters.txt. Мы придумали ключи и циклы для получения данных. И в конец файла AgentConfigGeneration.cmd добавляем следующую строчку:
type C:\zabbix\scripts\UserParameters.txt>> C:\zabbix\conf\zabbix_agentd.conf
Нам ещё нужно открыть порт на узле, если брандмауэр включён. Создаём файл OpenLocalPort.cmd
@echo off
set localportname=10050
set rulename=zabbix
set dirrname=in
set protocolname=TCP
set actionname=allow
netsh advfirewall firewall add rule name=%rulename% dir=%dirrname% action=%actionname% protocol=%protocolname% localport=%localportname%
Итак, сценарии мы написали. Вот что у нас получается:
![](https://habrastorage.org/files/88f/749/d08/88f749d08639494997c4d127bbfe1c73.png)
Теперь нужно определиться в очерёдности запусков этого добра:
1) Ввод переменных
2) Установка smartmontools в тихом режиме
3) Установка службы Zabbix Agent
4) Генерация конфига с пользовательскими параметрами — AgentConfigGeneration.cmd
5) Генерация списка дисков — DiskInfoGenerationJSON.cmd
6) Включение S.M.A.R.T. — GetSmartAllDisk.cmd.cmd
7) Открыть порт — OpenLocalPort.cmd
8) Запуск службы Zabbix Agent
Создаём в корне каталога zabbix файл INSTALL_AGENT.cmd и объединяем в нём все шаги наших сценариев:
@echo off
chcp 866 > nul
set /P CLIENT="Client NAME: "
set /P PSKID="PSKIdentity: "
set /P PSKkey="Enter PSKkey: "
cls
rem Устанавливаем smartmontools в тихом режиме
C:\zabbix\smartmontools\smartmontools-6.5-1.win32-setup.exe /S
rem Открывает порт 10050 в брандмауэре
set localportname=10050
set rulename=zabbix
set dirrname=in
set protocolname=TCP
set actionname=allow
netsh advfirewall firewall add rule name=%rulename% dir=%dirrname% action=%actionname% protocol=%protocolname% localport=%localportname%
echo "port %localportname% was open on host %hostname%"
rem создание конфига
@echo # zabbix_agent 3.0.1> C:\zabbix\conf\zabbix_agentd.conf
@echo. >>C:\zabbix\conf\zabbix_agentd.conf
@echo %PSKkey%>C:\zabbix\psk\Z_agent.psk
@echo LogFile=C:\zabbix\logs\logs.log >> C:\zabbix\conf\zabbix_agentd.conf
@echo LogFileSize=100 >> C:\zabbix\conf\zabbix_agentd.conf
@echo Server=30.0.1.1 >> C:\zabbix\conf\zabbix_agentd.conf
@echo ServerActive=30.0.1.1 >> C:\zabbix\conf\zabbix_agentd.conf
@echo StartAgents=3 >> C:\zabbix\conf\zabbix_agentd.conf
@echo Timeout=30 >> C:\zabbix\conf\zabbix_agentd.conf
@echo Hostname=%CLIENT%.%COMPUTERNAME%>> C:\zabbix\conf\zabbix_agentd.conf
@echo. >> C:\zabbix\conf\zabbix_agentd.conf
@echo ##### TLS ###########>> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSConnect=psk>> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSAccept=psk>> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSPSKFile=C:\zabbix\psk\Z_agent.psk >> C:\zabbix\conf\zabbix_agentd.conf
@echo TLSPSKIdentity=%PSKID%> C:\zabbix\conf\zabbix_agentd.conf
@echo. >> C:\zabbix\conf\zabbix_agentd.conf
rem Добавляем пользовательские параметры
type C:\zabbix\scripts\UserParameters.txt>> C:\zabb\conf\zabbix_agentd.conf
rem Создание списка дисков
@echo off
echo @echo off > c:\zabbix\disks\disks.cmd
echo echo {"data": >> c:\zabbix\disks\disks.cmd
echo echo [ >> c:\zabbix\disks\disks.cmd
for /F "tokens=1,3" %%a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe --scan') ^
do (for %%s in ("Device Model" "Product") ^
do (for /F "tokens=2*" %%c in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -i %%a -d %%b ^| find %%s ') ^
do (for %%i in ("Serial Number") do (for /F "tokens=3*" %%k in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -i %%a -d %%b ^| find %%i ') ^
do echo echo {"{#DISKPORT}":"%%a","{#DISKTYPE}":"%%b","{#DISKMODEL}":"%%d","{#DISKSN}":"%%k"},>> c:\zabbix\disks\disks.cmd))))
echo echo {"{#SMARTV}":"Smartctl 6.5"}>> c:\zabbix\disks\disks.cmd
echo echo ] >> c:\zabbix\disks\disks.cmd
echo echo } >> c:\zabbix\disks\disks.cmd
rem Включение смарт на всех дисках
for /F "tokens=1" %%a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe --scan') ^
do "C:\Program Files\smartmontools\bin\smartctl.exe" --smart=on --offlineauto=on --saveauto=on %%a
rem Установка службы Zabbix Agent
if DEFINED ProgramFiles(x86) (goto :x64) else (goto :x86)
:x64
C:\zabbix\bin\win64\zabbix_agentd.exe -i -c C:\zabbix\conf\zabbix_agentd.conf
goto :NEXT
:x86
C:\zabbix\bin\win32\zabbix_agentd.exe -i -c C:\zabbix\conf\zabbix_agentd.conf
goto :NEXT
:NEXT
rem Запуск службы Zabbix Agent
net start "Zabbix Agent"
echo.
echo OK!
@echo ------------------------------------
@echo Hostname: %CLIENT%.%COMPUTERNAME%
@echo ------------------------------------
@echo.
Pause
Упаковываем каталог zabbix в SFX-архив и шифруем паролем при необходимости
Пример.
Имеем сервер в организации «Организация 1». Помещаем zabbix.exe на сервер и распаковываем в корень тома C:\
Запускаем INSTALL_AGENT.cmd от имени Администратора. Вводим без пробелов название Организации, копируем из файла данных идентификатор PSK и ключ:
![](https://habrastorage.org/files/801/8a4/b0d/8018a4b0d95747ba92b4bb18c6aeaea9.png)
Enter:
![](https://habrastorage.org/files/b5a/7ed/ccd/b5a7edccda044fe2b379708444bd78ca.png)
Проверяем файл логов C:\zabbix\logs\logs.log:
![](https://habrastorage.org/files/f35/9d2/0a8/f359d20a80c04842a40f815249af2356.png)
Копируем Hostname “Organization1.SUNSET” в файл данных:
![](https://habrastorage.org/files/b37/281/90f/b3728190f90a42eeba1b873e062944b7.png)
И так далее с каждым хостом. После заполнения файла заходим в кабинет Zabbix — 10.3.10.1/zabbix — и добавляем из него группы, узлы. В настройках шифрования узла отмечаем PSK и ждём онлайна.
![](https://habrastorage.org/files/289/e4a/e58/289e4ae58538410e99f98fec48a32338.png)
![](https://habrastorage.org/files/2a4/8be/1e3/2a48be1e3fd843c994773686eac365cd.png)
Ждём несколько секунд:
![](https://habrastorage.org/files/3ca/03c/567/3ca03c5675d14ef6a13063c394ccf2ba.png)
О шифровании и об ограничениях
LLD
Русифицирую кабинет для разнообразия )
Создаём Шаблон S.M.A.R.T. и группы элементов данных. Для примера я создал следующие группы по атрибутам смарта:
![](https://habrastorage.org/files/659/0cd/8f8/6590cd8f85d44c45ad346904daf7d569.png)
Выбираем «Правила обнаружения» и создаём правило:
![](https://habrastorage.org/files/abb/aba/9c1/abbaba9c132c44f3aa92b1040e4f1306.png)
В поле «Ключ» указываем тот самый придуманный нами пользовательский параметр из файла C:\zabbix\scripts\UserParameters.txt
UserParameter=HDD.discovery,for /F "tokens=*" %a in ('C:\zabbix\disks\disks.cmd') do @echo %a
А во вкладке «Фильтры» пишем наши макросы из созданного файла c:\zabbix\disks\disks.cmd и жмём «Добавить»
![](https://habrastorage.org/files/6e8/620/97c/6e862097c09447d9a9d1aea5351242e3.png)
![](https://habrastorage.org/files/c26/6d5/3f3/c266d53f3e954d0f8805af9c475b2362.png)
Создадим «Прототипы элементов данных»
Я создам для примера два прототипа атрибута Spin_Retry_Count и добавлю в группу элементов данных Pre-fail: Spin_Retry_Count. Первый будет получать VALUE значение, второй THRESHOLD из таблицы атрибутов смарт для каждого обнаруженного диска
Обратимся ещё раз к файлу C:\zabbix\scripts\UserParameters.txt (ну или уже созданному конфигу). И посмотрим какие циклы у нас вытаскивают нужные нам данные:
UserParameter=HDD.value.[*], for /F "tokens=4" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 -d $2^| find "$3"') do @echo %a
UserParameter=HDD.thresh.[*], for /F "tokens=6" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 -d $2 ^| find "$3"') do @echo %a
Как видно из скрипта для ключей HDD.value.[*] и HDD.thresh.[*] нам нужно на вход три аргумента $1 – диск (/dev/*), $2 – тип диска (ata,sat и т.д.), $3 – атрибут (в нашем случае Spin_Retry_Count). В итоге ключ получит такой формат HDD.value.[$1,$2,$3]. Например для нашего диска /dev/sda типа «ata», будет так HDD.value.[/dev/sda,ata,Spin_Retry_Count]. Но поскольку мы создали макросы для каждого обнаруженного диска, формат ключа в прототипе элемента данных будет таков HDD.value.[{#DISKPORT},{#DISKTYPE},Spin_Retry_Count]. Этот ключ будет перебирать каждый диск по данному атрибуту.
Кстати, можем проверить ключ с сервера, c помощью zabbix_get
root@zabbix:~# zabbix_get -s 30.0.1.3 -k HDD.value.[/dev/sda,ata,Spin_Retry_Count] --tls-connect psk --tls-psk-identity "ZP10001AA" --tls-psk-file /root/Organization1.SUNSET.psk
![](https://habrastorage.org/files/74f/0e2/85d/74f0e285de8f4423b1d9a4f254ac811e.png)
И также для Threshold:
![](https://habrastorage.org/files/5b3/fde/c03/5b3fdec0388e4028b1c345232d588b52.png)
Итак, создаём наш прототип данных для VALUE и используем пассивную проверку:
![](https://habrastorage.org/files/b11/00a/369/b1100a3691cd481cab8de6f08f0db1bb.png)
Аналогично создаём прототип для Threshold. В итоге имеем:
![](https://habrastorage.org/files/929/074/8a6/9290748a6dd040f29c79e26d9883c7f7.png)
Создаём «Прототип триггера». Даём имя, например, для наглядности:
S.M.A.R.T.: ВНИМАНИЕ! Диск {#DISKMODEL} ( {#DISKPORT} — {#DISKTYPE} ). Ожидается сбой и\или полный отказ диска в ближайшие 24 часа! Значение атрибута хуже критического порога
В «Поле выражение» пишем условие:
({S.M.A.R.T.:HDD.value.[{#DISKPORT},{#DISKTYPE},Spin_Retry_Count].last()}-{S.M.A.R.T.:HDD.thresh.[{#DISKPORT},{#DISKTYPE},Spin_Retry_Count].last()})<0
Смысл в том, что если Value меньше Threshold — нужно выдать проблему. Last() – показывает последнее полученное значение (подробней о функициях). В поле «Описание» пишем, например:
Диск: {#DISKPORT}
Тип дика: {#DISKTYPE}
Модель: {#DISKMODEL}
Серийный номер: {#DISKSN}
Объяснение:
Threshold — это порог: если Value больше Threshold — атрибут в порядке; если меньше либо равен — с атрибутом проблемы. Именно по такому критерию утилиты, читающие S.M.A.R.T., выдают отчёт о состоянии диска либо отдельного атрибута вроде «Good» или «Bad».
Если VALUE стало меньше THRESH в случае Pre-fail атрибута - существует большая вероятность, что диск вылетит в ближайшие 24 часа.
/ Spin_Retry_Count /
Число повторных попыток раскрутки дисков до рабочей скорости в случае, если первая попытка была неудачной. Если значение атрибута увеличивается, то велика вероятность неполадок с механической частью.
Важность ставим «Чрезвычайная»
![](https://habrastorage.org/files/c52/382/5e3/c523825e38bd4ac38da888928c245c25.png)
Будем считать, что оповещение у нас настроено по EMAIL. Если нет, то сюда.
Идём в «Настройка» > «Действия». Создаём форму репорта. Жмём «Создать действие»
Имя: Отчёты о проблемах
Тема по умолчанию: ПРОБЛЕМА! [ {HOST.NAME} ] — {TRIGGER.NAME} ({EVENT.ID})
Сообщение по умолчанию:
Обнаружена проблема!
Категория: {TRIGGER.SEVERITY}
Узел: {HOST.NAME}
Описание узла: {HOST.DESCRIPTION}
Дата: {EVENT.DATE}
Время: {EVENT.TIME}
{TRIGGER.NAME}
Описание события:
{TRIGGER.DESCRIPTION}
Проблема получена на основе сл. данных:
1. {ITEM.NAME1} = {ITEM.VALUE1}. Ключ: {ITEM.KEY1}
2. {ITEM.NAME2} = {ITEM.VALUE2}. Ключ: {ITEM.KEY2}
{TRIGGER.EXPRESSION}
Event ID: {EVENT.ID}
Заполняем сообщение о восстановлении:
Тема восстановления: ОК. [ {HOST.NAME} ]
Сообщение о восстановлении:
Проблема события "{EVENT.ID}" сейчас устранена.
Узел: {HOST.NAME}
Описание узла: {HOST.DESCRIPTION}
Дата и время события: {EVENT.DATE} {EVENT.TIME}
Дата и время восстановления: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
Ранее была проблема: {TRIGGER.NAME}
Категория: {TRIGGER.SEVERITY}
Нынешний статус: ИСПРАВЛЕНО
Данные:
1. {ITEM.NAME1} = {ITEM.VALUE1}. Ключ: {ITEM.KEY1}
2. {ITEM.NAME2} = {ITEM.VALUE2}. Ключ: {ITEM.KEY2}
URL: {TRIGGER.URL}
Event ID: {EVENT.ID}
Включим «Активировать»
Переходим на вкладку «Условия» и заполняем как показано ниже:
![](https://habrastorage.org/files/143/84b/502/14384b5029ae46b18edca7f8b1abba34.png)
Я указал только «Чрезвычайные» проблемы для примера. Условия можно задавать какие душе угодно.
Переходим во вкладку «Операции» и добавляем либо группу нашего пользователя, либо указываем только себя. Тут в принципе комментировать нечего.
![](https://habrastorage.org/files/339/486/8f4/3394868f41de4134a5701372941c29bb.png)
Теперь я сымитирую сбой. У меня например вcе атрибуты впорядке, поэтому я изменю значение в триггере и поставлю «больше нуля»
({S.M.A.R.T.:HDD.value.[{#DISKPORT},{#DISKTYPE},Spin_Retry_Count].last()}-{S.M.A.R.T.:HDD.thresh.[{#DISKPORT},{#DISKTYPE},Spin_Retry_Count].last()})>0
Арифметику думаю объяснять не нужно.
Ждём некоторое время и получаем проблему:
![](https://habrastorage.org/files/4dc/9fd/5e1/4dc9fd5e106a4b35a5ab91296964566d.png)
И спустя пару секунд приходит сообщение на почту:
![](https://habrastorage.org/files/f44/8ce/068/f448ce0681924f9d8a9391a40d2b5eed.png)
После восстановления получим следующее сообщение:
![](https://habrastorage.org/files/7fe/7ef/dba/7fe7efdba87d4604a161c10fd26131cb.png)
Если есть ошибки, или что-то можно делать проще, пожалуйста сообщите! Писал тему пару часов со скринами, вроде дважды проверил на удачно.
Скачать готовый шаблон
PS: Особенного огонь когда zabbix отсылает поставщику сообщение с просьбой выставить счёт на новый диск или, например, когда заканчивается тонер в принтере кидает саппорту тикет на заправку картриджа, но это уже другая история…