Zabbix: LLD-мониторинг железа под Windows на PowerShell

Пришло время и мне собрать свой велосипед для мониторинга физического состояния Windows-железок. Готового решения или хоть более или менее работающего найти не удавалось с момента моего знакомства с Zabbix, а это более 3 лет. А тем более, чтобы оно было… элегантно что ли. Лично мне даже в таких вещах хочется видеть стройность и максимальную функциональность. Именно поэтому далее рассматривается только LLD и PowerShell. Ну и конечно же только бесплатное ПО.

Итак, мониторинг чего будет производиться:

  • S.M. A.R.T. дисков (информация, общее состояние и отдельные показатели)
  • Температуры, напряжение, обороты кулеров (на ваш выбор)

А выглядеть это все будет примерно так:

1e5e6faf148441f4adba4e1244b82348.jpg

Суммарно понадобятся:

  1. smartmontools
  2. OpenHardwareMonitor
  3. NSSM
  4. 2 скрипта на PS, приведенные ниже
  5. шаблон

Шаблон


Под спойлером находится актуальный шаблон. Просто сохраните содержимое в формате xml и импортируйте в свой Zabbix.
Шаблон


    3.2
    2017-02-28T06:24:10Z
    
        
            Templates
        
    
    
        
    
    
        
            {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
    
            

© Habrahabr.ru