Zabbix agent windows мониторинг дисков

Наткнулся на статью сис.админа Zerox на счёт мониторинга S.M.A.R.T. диска средствами Zabbix. Но что-то у меня никак не получалось по его записи. Поэтому я опишу свой опыт настройки это необходимой вещи.

 Если вы здесь потому что вы начали майнить Chia можете написать мне все мои Контакты, могу предложить услугу по внедрению этого решения на ваши фермы, уже есть опыт. 

Будем разворачивать решение с Github. По сути, эта запись просто перевод с небольшими пояснениями. :)

Все необходимые компоненты я сложил в архив, который можно скачать с Я.Диска (если ссылка сломалась пишите к комменты, стучите на почту, смотрите на github).

Содержание

Возможности решения

Данное решает такие задачи:

  1. Мониторинг состояние S.M.A.R.T диска (почти всех показателей);
  2. Мониторинг оставшегося ресурса SSD;
  3. Мониторинг температуры;
  4. Мониторинг производителя, партийного номера, серийного номера (Zabbix вас оповестит, если диск был заменен), что позволяет настроить инвентаризацию;
  5. Мониторинг количество неисправных секторов на диске;

Подготовка Zabbix-Server

Всё, что Вам потребуется, это добавить замечательный шаблон в свой Zabbix.

Подготовка Zabbix-Agent Windows

Установка smartmontools

Ничего необычного, просто устанавливаем smartmontools, как обычную программу. Единственный момент, не рекомендую менять путь, иначе его надо будет менять в конфиге агента и в скрипте.

Конфигурирование агента

Создаем папку scripts и помещаем туда наш скрипт smartctl-disks-discovery.ps1

Открываем zabbix_agentd.conf и правим

#Увеличиваем TimeOut до 30 секунд. Как показывает практика. Если этого будет мало, то потом увеличим.  

TimeOut = 20

И добавляем пользовательскую проверку

UserParameter=uHDD.get[*], for /F «tokens=* usebackq» %a in (`«»%ProgramFiles%\smartmontools\bin\smartctl.exe» -i -H -A -l error -l background $1″`) do @echo %a

UserParameter=uHDD.discovery[*],powershell NoProfile ExecutionPolicy Bypass File «%ProgramFiles%\Zabbix Agent\scripts\smartctl-disks-discovery.ps1»

UserParameter=uSSD.get[*], for /F «tokens=* usebackq» %a in (`«»%ProgramFiles%\smartmontools\bin\smartctl.exe» -i -H -A -l error -l background $1″`) do @echo %a

UserParameter=uSSD.discovery[*],powershell NoProfile ExecutionPolicy Bypass File «%ProgramFiles%\Zabbix Agent\scripts\smartctl-disks-discovery.ps1»

Осталось перезапустить агента и привязать наш хост к шаблону.

Примерно через час прилетят данные. (Для отладки можно поменять время обнаружения, я обычно ставлю 10 минут, меняем 1h на 10m. Главное, не забыть обратно вернуть).

Результат

Таким образом мы настроили мониторинг SSD и HDD дисков. Данное решение отлично показывает себя в проде. По критически важным дискам можно строить вот такие информативные графики. Мне нравится :)

ТраблШутинг

У меня такая проблема возникала, когда забыл ставить smartmontools

Invalid discovery rule value: cannot parse as a valid JSON object: invalid JSON object value starting character at: ????? ???? ?? ??? ?????? ? ?????? NULL.

C:\Program Files\Zabbix Agent\scripts\smartctldisksdiscovery.ps1:34 ????:73

+ $disk_name = $smart_scanresul

Просмотры: 5 842

Skip to content

В данной статье будем прикручивать к Zabbix мониторинг жестких дисков Windows, для мониторинга жестких дисков Linux (Ubuntu) смотрите в этой статье.

Начнем с установки Smartmontools в Windows, скачиваем smartmontools от сюда выбираем последнюю версию (на момент написания статьи была использована версия smartmontools-5.41-1.win32-setup.exe) и устанавливаем (ничего не меняя, Далее..).

Добавляем строки в C:\Program Files\Zabbix Agent\zabbix-agentd.conf:

##### SMARTMONTOOLS HDD MONITORING#####################
UserParameter=HDD[*], for /F "tokens=10" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -A $1 ^| find "$2"') do @echo %a
UserParameter=HDD.health.[*], for /F "tokens=6" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -H $1 ^| find "test"') do @echo %a
UserParameter=HDD.model.[*],for /F "tokens=3*" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -i $1 ^| find "Device Model"') do @echo %a %b
UserParameter=HDD.sn.[*],for /F "tokens=3" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -i $1 ^| find "Serial Number"') do @echo %a
UserParameter=HDD.errorlog.[*], for /F "tokens=4" %a in ('C:\"Program Files"\smartmontools\bin\smartctl.exe -l error $1 ^| find "ATA Error Count"') do @echo %a
UserParameter=HDD.rv.a,"C:\"Program Files"\smartmontools\bin\smartctl.exe" -H -q silent /dev/sda & echo %errorlevel%
UserParameter=HDD.rv.b,"C:\"Program Files"\smartmontools\bin\smartctl.exe" -H -q silent /dev/sdb & echo %errorlevel%
UserParameter=HDD.rv.c,"C:\"Program Files"\smartmontools\bin\smartctl.exe" -H -q silent /dev/sdb & echo %errorlevel%

Перезапускаем службу zabbix агента в Windows:

START -> Control Panel -> Administrative Tools -> Services
Ищем zabbix-agent -> Stop -> Start

Пробуем получить с Zabbix-agent информацию о температуре жесткого диска. Это делается там, где установлен Zabbix сервер.

zabbix_get -s 192.168.1.5 -k HDD[sdb,Temperature_Celsius]

Остается сделать шаблон на web морде Zabbix сервера, смотрите в этой статье.

Будем считать, что сервер Zabbix 3.0.4 у нас установлен. Для скриптов установки агента будем использовать, по хардкору, только родную командную строку Windows, без питонов, перлов и т.п., т.е. без дополнительных инсталляций в систему агента. Шифрование настроим с помощью PSK.

Внешний 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:\

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 для наглядности. Можно использовать и базу данных. Что-то типа этого:

Поле 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 

Ключ –d указывает на тип диска.

Заинтересуемся диском /dev/sda. Пока он мало о чём говорит кроме того, что он ATA-типа и скорей всего загрузочный.

Смотрим информацию о нём:

c:\>"Program Files"\smartmontools\bin\smartctl.exe -i /dev/sda -d ata 

Уже интересней. Как видно СМАРТ отключён. Включаем его:

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

Таблицу смарт у RAID посмотреть не получится, но статус health получить сможем.

Смотрим SMART Health:

c:\>"Program Files"\smartmontools\bin\smartctl.exe -H /dev/sda -d ata

Теперь то же самое нужно сделать для остальных 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 со следующим содержимым:

Создаём в каталоге 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%

Итак, сценарии мы написали. Вот что у нас получается:

Теперь нужно определиться в очерёдности запусков этого добра:

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 и ключ:

Enter:

Проверяем файл логов C:\zabbix\logs\logs.log:

Копируем Hostname “Organization1.SUNSET” в файл данных:

И так далее с каждым хостом. После заполнения файла заходим в кабинет Zabbix — 10.3.10.1/zabbix — и добавляем из него группы, узлы. В настройках шифрования узла отмечаем PSK и ждём онлайна.

Ждём несколько секунд:

О шифровании и об ограничениях

LLD

Русифицирую кабинет для разнообразия )

Создаём Шаблон S.M.A.R.T. и группы элементов данных. Для примера я создал следующие группы по атрибутам смарта:

Выбираем «Правила обнаружения» и создаём правило:

В поле «Ключ» указываем тот самый придуманный нами пользовательский параметр из файла 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 и жмём «Добавить»

Создадим «Прототипы элементов данных»

Я создам для примера два прототипа атрибута 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

И также для Threshold:

Итак, создаём наш прототип данных для VALUE и используем пассивную проверку:

Аналогично создаём прототип для Threshold. В итоге имеем:

Создаём «Прототип триггера». Даём имя, например, для наглядности:

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 /
Число повторных попыток раскрутки дисков до рабочей скорости в случае, если первая попытка была неудачной. Если значение атрибута увеличивается, то велика вероятность неполадок с механической частью.

Важность ставим «Чрезвычайная»

Будем считать, что оповещение у нас настроено по 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}

Включим «Активировать»

Переходим на вкладку «Условия» и заполняем как показано ниже:

Я указал только «Чрезвычайные» проблемы для примера. Условия можно задавать какие душе угодно.

Переходим во вкладку «Операции» и добавляем либо группу нашего пользователя, либо указываем только себя. Тут в принципе комментировать нечего.

Теперь я сымитирую сбой. У меня например в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

Арифметику думаю объяснять не нужно.

Ждём некоторое время и получаем проблему:

И спустя пару секунд приходит сообщение на почту:

После восстановления получим следующее сообщение:

Если есть ошибки, или что-то можно делать проще, пожалуйста сообщите! Писал тему пару часов со скринами, вроде дважды проверил на удачно.

Скачать готовый шаблон

PS: Особенного огонь когда zabbix отсылает поставщику сообщение с просьбой выставить счёт на новый диск или, например, когда заканчивается тонер в принтере кидает саппорту тикет на заправку картриджа, но это уже другая история…

This article omits the installation of zabbix server. For the installation of zabbix server, you can check the article I published earlier. Currently, zabbix4.0server is used as an example to monitor the usage of c disk separately. This article does not involve disk writing, just disk space. The usage rate is theoretically universal for all versions.

1. Download zabbix-agent

The current use of Windows2012 system as an example, theories are common to all systems, other systems please self-test!

Https://www.zabbix.com/cn/download_agents#tab:40LTS

Zabbix-agent provides windows (msi) package from 4.0, and it is more convenient to install directly with one button.

Https://assets.zabbix.com/downloads/4.0.13/zabbix_agent-4.0.13-win-amd64-openssl.msi

How To Use Zabbix Monitor Windows Disk Usage

2, install zabbix-agent

Run the zabbix_agent-4.0.*-win-amd64-openssl.msi installer on a Windows2012 server






After the default installation is complete, zabbix-agent will be automatically added to the Windows system service and automatically started. Please note that there is a firewall to open the port 10050 , otherwise zabbix-server can not get the data.

So simple zabbix-agent installation is complete, the rest of the steps are all in zabbix-server!

3, zabbix_get verification

Verify that the data can be obtained by zabbix_get command on zabbix-server

1 zabbix_get – s agent端的IP地址 – k “vfs.fs.size[c:,total]”

If the value can be returned normally, it means that the agent has no problem.

4, create a template in the zabbix-server console

Log in to the zabbix-server console, configure → template → create template

5, parameter description

The vfs.fs.size[fs,<mode>] key value is required to monitor disk usage.

Fs: file system
Mode: mode
Total default all, free idle, used, pfree free percentage, used percentage

6, create a monitoring item in the zabbix-server console

Click on the created template to add monitoring items.

Name: total amount of c disk
Key value: vfs.fs.size[c:,total]

Other parameters change according to usage. If you are configuring for the first time, then I suggest you not to change it.

Next continue to create free, used, create methods and total the same as total

12 名称: c盘剩余量 键值vfs . fs . size [ c : , free ] 名称: c盘使用量 键值vfs . fs . size [ c : , used ]

Add pfree, pused, note that these two information types need to choose floating point number, unit %

12 名称: c盘剩余百分比 键值: vfs . fs . size [ c : , pfree ] 名称: c盘使用百分比 键值: vfs . fs . size [ c : , pused ]

7, create a trigger in zabbix-server (optional)

Problem representation: {windows:vfs.fs.size[c:,pfree].last()}<=5
Restore expression: {windows:vfs.fs.size[c:,pfree].last()}>5


8, create a graphic in zabbix-server

9, template associated host

In Configuration → Host → Create Host

Click on the template, link the template you just created, and click Add.

Wait patiently for a while, you can see the use of Windows 2012 c drive, note: This value is different from what you see in Windows, because of the conversion method, not too tangled!

The same method applies to d disk, e disk, etc.

Замечание!

Это немного устаревшая статья. Описанный в ней способ сейчас мною не используется. Использую более простой способ, который описан тут: Мониторинг дискового пространства активным Zabbix-агентом

Лирическое отступление.

В Zabbix, как многие помнят, агент, устанавливаемый  на подопечный компьютер, может работать в двух режимах: активном и пассивном.

При работе в активном режиме агент сам  собирает какие-то данные с компьютера  и затем с заданной периодичностью отсылает их на сервер. В пассивном режиме агент выдает минимальный набор данных самостоятельно, а все остальные данные исключительно по запросу с сервера.

При использовании агента в пассивном режиме прямо «из коробки» доступно много «вкусных плюшек»: слежение за нагрузкой сетевых адаптеров, наблюдение за дисковой подсистемой, слежение за свободным местом на всех дисках, слежение за системными журналами и прочее…

А что делать, если агент находится за NAT?  Понятно, что без проброса портов сервер не может отправить команду агенту напрямую, и работа агента в этом случае  возможна только в активном режиме… Но при этом очень хочется  иметь данные, например,  о количестве свободного места на дисках!

Всё? Приплыли? Ничуть!

Лирическое наступление.

Итак, ставим задачу: следить за системным диском (%systemdrive%) подопечного компьютера, а именно за количеством свободного места на нём.

Следить можно за всеми дисками, но наиболее важно, по-моему, иметь данные о количестве свободного места как раз на системном диске. Если на каком-то другом диске закончится свободное место, пользователь сам это заметит и сообщит о такой неприятности, при этом  система продолжит нормальную работу. Если же на системном диске закончится свободное пространство, стабильную работу системы гарантировать сложно.

Усложним себе задачу. 🙂

Пробрасывать порты не будем. Новомодные инструменты типа Windows PowerShell использовать  не будем потому, что  PowerShell на некоторых системах просто нет.

Будем использовать командную строку, встроенный планировщик заданий и немного VBS-скриптов.

Ну… Это всё была преамбула, теперь наступил черёд «амбулы».

«Амбула».

1.  Устанавливаем на подопечный компьютер Zabbix-агента:

  • Путь установки программы: C:\zabbix
  • Папку с самописными скриптами располагаем тут: C:\zabbix\scripts
  • Файл с настройками тут: C:\zabbix\zabbix_agentd.win.conf

Т.к. этот агент будет располагаться за NAT и не будет иметь возможности получать команды от сервера, то  одержимое  файла с настройками будет примерно таким:

LogFile=c:\zabbix\zabbix_agentd.log
Server=xx.yy.zz.yy
ServerActive=xx.yy.zz.yy
Hostname=hostname.mihanik.net
StartAgents=0
RefreshActiveChecks=120
EnableRemoteCommands=1

####### USER-DEFINED MONITORED PARAMETERS #######

####### Слежение за свойствами диска #######
# Для Windows

### Процент свободного места на системном диске ###
UserParameter=Win_SysDrv_PercentFreeSpace, C:\Windows\System32\cscript.exe C:\zabbix\scripts\WinDriveInfo.vbs %SystemDrive% PercentFreeSpace
# Проверить
# C:\zabbix\zabbix_agentd.exe -c c:\zabbix\zabbix_agentd.win.conf -t Win_SysDrv_PercentFreeSpace

### Общий размер системного диска ###
UserParameter=Win_SysDrv_TotalSize, C:\Windows\System32\cscript.exe C:\zabbix\scripts\WinDriveInfo.vbs %SystemDrive% TotalSize
# Проверить
# C:\zabbix\zabbix_agentd.exe -c c:\zabbix\zabbix_agentd.win.conf -t Win_SysDrv_TotalSize

### Размер свободного пространства на системном диске ###
UserParameter=Win_SysDrv_FreeSpace, C:\Windows\System32\cscript.exe C:\zabbix\scripts\WinDriveInfo.vbs %SystemDrive% FreeSpace
# Проверить
# C:\zabbix\zabbix_agentd.exe -c c:\zabbix\zabbix_agentd.win.conf -t Win_SysDrv_FreeSpace

В  самом конце я описал 3 (три) пользовательских параметра, которые мне хотелось бы отсылать на сервер:

  • UserParameter=Win_SysDrv_PercentFreeSpace
  • UserParameter=Win_SysDrv_TotalSize
  • UserParameter=Win_SysDrv_FreeSpace

%SystemDrive% — это, как вы догадались, имя системного диска Windows. 🙂

Чтобы автоматизировать процесс установки использую простенький скриптик: Zabbix_Install.bat

2. Размещаем  в папке C:\zabbix\scripts простенький VBS-скрипт,

Он, собственно, и будет собирать нужные нам данные. Назвал я его так: c:\zabbix\scripts\WinDriveInfo.vbs

Вот небольшая инструкция по использованию скриптика:

Запуск скрипта:
WinDriveInfo.vbs <Имя диска> <Свойство диска> [<Режим работы скрипта>]

<Имя диска> — имя диска, свойства которого нужно получить

<свойство диска> — свойство, которое нужно получить

VolumeName — Название тома(не C:\, именно название)
TotalSize — Полный размер диска В БАЙТАХ
FreeSpace — Свободное место на диске В БАЙТАХ
SerialNumber — c серийный номер жёсткого диска
DriveLetter — буква, назначенная диску (без всяких : и :\)
DriveType — тип диска(съёмный, не съёмный, сетевой, CD-ROM или RAM-диск)
FileSystem — файловая система диска(FAT32, NTFS и т.д.)
RootFolder — путь к корневой папке(для диска С — C:\)
Path — то же, что и RootFolder, но вернёт он C: , без \
IsReady — доступность диска в данный момент(True или False)
PercentFreeSpace — процент свободного места на диске с точностью до сотых

<режим работы скрипта> — (может отсутствовать)

trap — использовать zabbix_sender для отправки данных на zabbix-сервер,
notrap (по умолчанию) — не использовать zabbix_sender для отправки данных.

Важно!!! Т.к. скрипт я писал для себя, то в нём нет защиты от дурака и особо нет контроля передаваемых скрипту параметров. Кому нужно, можете сами дописать. 🙂

3. Перезапускаем службу zabbix-агента и проверяем, что наши пользовательские параметры работают правильно.

Т.е. последовательно выполняем 3 команды:

  • C:\zabbix\zabbix_agentd.exe -c c:\zabbix\zabbix_agentd.win.conf -t Win_SysDrv_PercentFreeSpace
  • C:\zabbix\zabbix_agentd.exe -c c:\zabbix\zabbix_agentd.win.conf -t Win_SysDrv_TotalSize
  • C:\zabbix\zabbix_agentd.exe -c c:\zabbix\zabbix_agentd.win.conf -t Win_SysDrv_FreeSpace

Вот пример корректной работы первой команды:

Видно, что у меня на диске 75,12% свободного места. 🙂

Если ошибок нет, продолжаем дальше…

4. Теперь идём в web-интерфейс вашего Zabbix-сервера и создаём новый шаблон с именем  Win_SysDrv_Monitoring.

Важно!!!

При создании элементов данных указываем, что получать мы их будем при помощи Zabbix траппера.

Приведу скриншоты уже настроенного шаблона.

Особо ленивые могут скачать готовый шаблон тут: Win_SysDrv_Monitoring.xml

5. Назначаем подопечному компьютеру созданный нами шаблон и нажимаем кнопку «обновить».

6. Проверяем работу на текущем этапе.

Идём в Мониторинг, заходим в последние данные, выбираем нужный нам подопечный компьютер и видим… Ничего мы не видим. Данные не попадают на сервер.

Почему?

Потому, что пользовательские параметры, описанные нами в конце конфигурационного файла, Zabbix-агент отправляет на сервер только по прямому запросу с этого самого сервера. А агент-то находится за NAT, т.е. сервер отдать команду агенту не может, ведь порт с сервера на агента мы тоже не пробросили…

Получается, что агент про параметры знает, но отправлять их на сервер не будет:  «Команды не было!». 🙂

Получается, что нам нужно как-то самим отправлять данные на сервер по расписанию.

7. Настраиваем отправку данных по расписанию.

Идём в управление подопечным компьютером и в планировщике заданий создаём новую папку с именем Zabbix.

В этой папке создаём три простых задачи, которые будут работать от имени пользователя «система», и по нужному вам расписанию выполнять сбор данных, а потом эти данные будут отправлять на сервер

Задача Win_SysDrv_FreeSpace должна выполнять команду

C:\Windows\System32\cscript.exe C:\zabbix\scripts\WinDriveInfo.vbs %SystemDrive% FreeSpace TRAP

Задача Win_SysDrv_TotalSize  должна выполнять команду

C:\Windows\System32\cscript.exe C:\zabbix\scripts\WinDriveInfo.vbs %systemdrive% TotalSize TRAP

Задача Win_SysDrv_PercentFreeSpace должна выполнять команду

C:\Windows\System32\cscript.exe C:\zabbix\scripts\WinDriveInfo.vbs %SystemDrive% PercentFreeSpace TRAP

Кому лень создавать задачи самостоятельно, могут импортировать их из этих файлов: Win_SysDrv_TotalSize.xml,  Win_SysDrv_PercentFreeSpace.xml,  Win_SysDrv_FreeSpace.xml

Смысл каждой команды следующий: мы просим интерпретатор cscript запустить на выполнение скрипт WinDriveInfo.vbs с нужными нам параметрами.

ВАЖНО!!!

Если вы в качестве «Программы или сценария» укажете не  интерпретатор cscript, а выберете непосредственно сам скрипт, то ваша задача стартует, но НЕ ЗАВЕРШИТСЯ!!

Причина очень проста: по умолчанию в Windows используется интерпретатор wscript. а он команду .Echo выводит не в консоль, как нам нужно, а выбрасывает MsgBox c кнопкой, которую, конечно же, будет некому нажать…

ТОЖЕ ВАЖНО!!!

Обязательно используйте 3 (третий) параметр скрипта TRAP. Именно благодаря этому параметру скрипт будет понимать, что полученные данные нужно не передавать Zabbix-агенту, а отправлять их сразу непосредственно  на ваш Zabbix-сервер.

8. Окончательная проверка.

Идём в Мониторинг, заходим в последние данные, выбираем нужный нам подопечный компьютер и видим, что данные потекли…

Я  взял данные с реального компьютера клиента:

Видно, что на системном диске мало места… И, да!!! На панели тут же отобразилось предупреждение!!!

УРА!!!

Всё работает!!!

Пы.Сы.

Я описал реальный работающий способ в виде «как есть».

В нём есть некоторые недочёты, которые потом будут исправляться, но этот пример может кому-то помочь решать свои задачи.

🙂

УДАЧИ!!!


  • Z490 a pro установка windows
  • Zabbix agent windows конфигурационный файл
  • Zabbix agent windows xp 32 bit
  • Z 2 usb считыватель настольный драйвер windows 10
  • Z397 guard converter driver windows 10