Zabbix: LLD-мониторинг железа под Windows на PowerShell
Пришло время и мне собрать свой велосипед для мониторинга физического состояния Windows-железок. Готового решения или хоть более или менее работающего найти не удавалось с момента моего знакомства с Zabbix, а это более 3 лет. А тем более, чтобы оно было… элегантно что ли. Лично мне даже в таких вещах хочется видеть стройность и максимальную функциональность. Именно поэтому далее рассматривается только LLD и PowerShell. Ну и конечно же только бесплатное ПО.
А выглядеть это все будет примерно так:
Под спойлером находится актуальный шаблон. Просто сохраните содержимое в формате xml и импортируйте в свой Zabbix.
Шаблон создан в Zabbix версии 3.2, возможно, будет работать и в более ранних версиях. Ключи стандартны и имеют вид ZScript[имя_скрипта, параметр1,…, параметрN]. Параметры передаются непосредственно в сам скрипт.
Надеюсь, шаблон получился максимально простым и понятным.
Ниже приведены необходимые скрипты. Внутри уже находятся и обнаружение, и запрос отдельных элементов. Работа проверена на Windows от 7 SP1 до 2012 R2. Само собой, решение с Execution Policy остается за вами.
Обнаруживаются только диски с задействованным СМАРТом. Параметры запрашиваются из столбца «RAW_VALUE». Хотите мониторить другой параметр? Просто укажите его номер. По умолчанию скобки и их содержимое отбрасываются. Если нужный вам параметр диск не отдает, то возвращается пустое поле.
Итак, мониторинг чего будет производиться:
- S.M. A.R.T. дисков (информация, общее состояние и отдельные показатели)
- Температуры, напряжение, обороты кулеров (на ваш выбор)
А выглядеть это все будет примерно так:
Суммарно понадобятся:
- smartmontools
- OpenHardwareMonitor
- NSSM
- 2 скрипта на PS, приведенные ниже
- шаблон
Шаблон
Под спойлером находится актуальный шаблон. Просто сохраните содержимое в формате xml и импортируйте в свой Zabbix.
Шаблон
3.2
2017-02-28T06:24:10Z
Templates
Hardware - Windows
Hardware - Windows
Необходимы компоненты:
smartmontools (прописать Path), OHM (как сервис)
Необходимые скрипты:
windows.hard.ps1 -> C:\System\Zabbix\Scripts\
UserParameter=ZScript[*],powershell C:\System\Zabbix\Scripts\windows.$1.ps1 "$2" "$3"
Templates
Жесткие диски
Оборудование
-
Напряжение батареи BIOS
0
0
ZScript[hard,VBAT]
300
90
365
0
0
V
0
0
0
0
1
0
0
0
Оборудование
Обнаружение кулеров
0
ZScript[hard,discovery,fan]
7200
0
0
0
0
0
0
3
Обороты кулера {#NAME}
0
0
ZScript[hard,{#ID},fan]
300
90
365
0
3
0
0
0
0
1
0
0
0
Оборудование
{Hardware - Windows:ZScript[hard,{#ID},fan].last()}<200
0
Проблема в кулером {#NAME} на {HOST.NAME}
0
0
3
0
0
Обнаружение датчиков температур
0
ZScript[hard,discovery,temperature]
7200
0
0
0
0
0
0
3
Температура {#NAME}
0
0
ZScript[hard,{#ID},temperature]
120
90
365
0
3
°C
0
0
0
0
1
0
0
0
Оборудование
{Hardware - Windows:ZScript[hard,{#ID},temperature].last(#3)}>60
0
Высокая температура {#NAME} на {HOST.NAME}!
0
0
4
0
0
{Hardware - Windows:ZScript[hard,{#ID},temperature].last(#3)}>70
0
Слишком высокая температура {#NAME} на {HOST.NAME}!
0
0
5
0
0
Обнаружение датчиков напряжения
0
ZScript[hard,discovery,voltage]
7200
0
0
0
0
0
0
3
Напряжение {#NAME}
0
0
ZScript[hard,{#ID},voltage]
300
90
365
0
0
V
0
0
0
0
1
0
0
0
Оборудование
Обнаружение дисков
0
ZScript[hdd,discovery]
7200
0
0
0
0
0
0
3
Диск {#DISKID} - SMART - Spin-Up Time [3]
0
0
ZScript[hdd,{#DISKID},3]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Reallocated Sectors Count [5]
0
0
ZScript[hdd,{#DISKID},5]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Seek Error Rate [7]
0
0
ZScript[hdd,{#DISKID},7]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Power-on Time Count [9] (часов)
0
0
ZScript[hdd,{#DISKID},9]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Spin-Up Retry Count [10]
0
0
ZScript[hdd,{#DISKID},10]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - G-sense error rate [191]
0
0
ZScript[hdd,{#DISKID},191]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Температура [194]
0
0
ZScript[hdd,{#DISKID},194]
300
90
365
0
3
°C
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Reallocation Event Count [196]
0
0
ZScript[hdd,{#DISKID},196]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Current Pending Sector Count [197]
0
0
ZScript[hdd,{#DISKID},197]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - Uncorrectable Sector Count [198]
0
0
ZScript[hdd,{#DISKID},198]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - SMART - UltraDMA CRC Error Count [199]
0
0
ZScript[hdd,{#DISKID},199]
3600
90
365
0
3
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - Номинальная емкость
0
0
ZScript[hdd,{#DISKID},capacity]
3600
7
0
0
1
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - Семество
0
0
ZScript[hdd,{#DISKID},family]
3600
7
0
0
1
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - Версия FW
0
0
ZScript[hdd,{#DISKID},fw]
3600
7
0
0
1
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - Модель
0
0
ZScript[hdd,{#DISKID},model]
3600
7
0
0
1
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - Серийный номер
0
0
ZScript[hdd,{#DISKID},serial]
3600
7
0
0
1
0
0
0
0
1
0
0
0
Жесткие диски
Диск {#DISKID} - Статус SMART
0
0
ZScript[hdd,{#DISKID},status]
300
7
0
0
1
0
0
0
0
1
0
0
0
Жесткие диски
{Hardware - Windows:ZScript[hdd,{#DISKID},status].regexp(^PASSED$)}=0
0
SMART диска не пройден на {HOST.NAME}
0
0
4
0
0
{Hardware - Windows:ZScript[hdd,{#DISKID},194].last()}>55
0
Высокая температура диска на {HOST.NAME}
0
0
3
0
0
{Hardware - Windows:ZScript[hdd,{#DISKID},194].last()}>60
0
Опасная температура диска на {HOST.NAME}
0
0
4
0
0
{Hardware - Windows:ZScript[hard,VBAT].last(#3)}<2.9
0
Слишком низкое напряжение батареи BIOS на {HOST.NAME}
0
0
3
0
0
Шаблон создан в Zabbix версии 3.2, возможно, будет работать и в более ранних версиях. Ключи стандартны и имеют вид ZScript[имя_скрипта, параметр1,…, параметрN]. Параметры передаются непосредственно в сам скрипт.
Надеюсь, шаблон получился максимально простым и понятным.
Скрипты PS
Ниже приведены необходимые скрипты. Внутри уже находятся и обнаружение, и запрос отдельных элементов. Работа проверена на Windows от 7 SP1 до 2012 R2. Само собой, решение с Execution Policy остается за вами.
windows.hdd.ps1 → Для smartmontools
# 2017/02/21 AcidVenom v2
# Скрипт для обнаружения дисков и получения их данных для Zabbix
param($1,$2)
# Автообнарежение дисков
# Ключ: discovery
if ($1 -eq "discovery") {
try {
$items = smartctl-nc --scan-open | where {$_ -match "/dev/sd"}
write-host -NoNewline "{"
write-host -NoNewline "`"data`":["
$n = 0
foreach ($obj in $items) {
$n = $n + 1
if ((smartctl-nc -i $obj | ? {$_ -match "SMART support is: Enabled"}) -ne "") {
$line = "{`"{#DISKID}`":`"" + ($obj.substring(5,3)) + "`"}"
If ($n -lt $items.Count) { $line = "$line,"}
write-host -NoNewline $line
}
}
write-host -NoNewline "]"
write-host -NoNewline "}"
}
catch {exit}
}
# Получение информации от дисков
# Ключи:
else {
if ($2 -eq "status") {
$obj = smartctl-nc -H /dev/$1 | where {$_ -match "result:"}
$obj = $obj.substring(50)
}
elseif ($2 -eq "model") {
$obj = smartctl-nc -i /dev/$1 | where {$_ -match "Device Model:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "family") {
$obj = smartctl-nc -i /dev/$1 | where {$_ -match "Model Family:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "fw") {
$obj = smartctl-nc -i /dev/$1 | where {$_ -match "Firmware Version:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "serial") {
$obj = smartctl-nc -i /dev/$1 | where {$_ -match "Serial Number:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "capacity") {
$obj = smartctl-nc -i /dev/$1 | where {$_ -match "User Capacity:"}
if ($obj -match "User Capacity:") {
$obj = $obj.Substring($obj.IndexOf("[")+1,$obj.IndexOf("]")-$obj.IndexOf("[")-1)
}
else {
$obj = "N/A"
}}
# Получение показателей SMART
# Значения без скобок и их содержимого
else {
try {
$obj = smartctl-nc -A /dev/$1 | where {$_ -match "^ *$2"}
try {$obj = $obj.Substring(87,$obj.IndexOf("(")-87)}
catch {$obj = $obj.Substring(87)}
}
catch {$obj = ""}
}
Write-Output $obj
}
Обнаруживаются только диски с задействованным СМАРТом. Параметры запрашиваются из столбца «RAW_VALUE». Хотите мониторить другой параметр? Просто укажите его номер. По умолчанию скобки и их содержимое отбрасываются. Если нужный вам параметр диск не отдает, то возвращается пустое поле.
windows.hard.ps1 → для OHM
# 2017/02/13 AcidVenom v2
# Скрипт для обнаружения разных датчиков для Zabbix
param($1,$2)
# Автообнарежение датчиков температуры, напряжения, оборотов кулеров
# Ключи: discovery temperature