UPD. Материал хоть и позаимствованный, но попользовавшись предложенным решением пару дней, быстро обнаружил неудобные моменты. Мониторинг быстро обнаружил умирающий диск (одновременно и хорошо и плохо), и тут начался праздник, диск, с которым проблемы пришлось искать, т.к. сообщение пришло о сервере, на котором выявлена проблема, но о том, что это за диск... Далее сам текст почти менять не буду, изменён будет только скрипт и XML файл. И да, картинки останутся так-же авторские.

Для мониторинга за жесткими дисками, в том числе за температурой в windows, будем использовать smartmontools под windows. Скрипт для автообнаружения и формирования выдачи в zabbix будет работать на powershell.

Устанавливаем smartmontools. После установки рекомендую сразу проверить работу. Для этого открываем командную строку, переходим в директорию C:\Program Files\smartmontools\bin и выполняем:

# smartctl --scan-open

smartctl в windows

Вы должны увидеть список всех дисков в системе. Дальше можете посмотреть информацию о дисках, например так:

# smartctl -A /dev/sda
# smartctl -i /dev/sda

Если все в порядке, информация о дисках выводится, продолжаем. Нам нужен скрипт для парсинга вывода. Я не стал придумывать свой, к тому же на powershell писать практически не умею, взял за основу готовый, который реализует тот же функционал, что описанный выше для linux.

<#
    .VERSION
    0.2
    
    .SYNOPSIS
    Script with LLD support for getting data about HHD SMART to Zabbix monitoring system.

    .DESCRIPTION
    The script may generate LLD data for SMART HDD

    .NOTES
    Author: Pimenov
    Github: 
#>

Param (
[switch]$version = $false,
[ValidateSet("lld","health","state")][Parameter(Position=0, Mandatory=$True)][string]$action,
[ValidateSet("HDD","SMART")][Parameter(Position=1, Mandatory=$True)][string]$part,
[string][Parameter(Position=3)]$HDDid,
[string][Parameter(Position=4)]$SmartCode
)

$cli = "c:\Program Files\smartmontools\bin\smartctl.exe"


function LLDHDD()
{
    $items =& $cli --scan-open | where {$_ -match "/dev/sd"}
    foreach ($obj in $items) {
        [array]$item = & $cli -i $obj.substring(0,8)
        if (($item | where {$_ -match "SMART support is: Enabled"}) -ne $null) {
            foreach ($str in $item)
            {
                if ($str.contains("Device Model:"))
                {
                    $HDD_model = (($item[5] -split ':')[1]).Trim()
                }
                if ($str.contains("Serial Number:"))
                {
                    $HDD_sn = (($item[6] -split ':')[1]).Trim()
                }
            }
            $HDD_info = [string]::Format('{{"{{#HDD.ID}}":"{0}","{{#HDD.MODEL}}":"{1}","{{#HDD.SN}}":"{2}"}},',$obj.substring(0,8),$HDD_model, $HDD_sn)
            $HDD_json += $HDD_info
        }
    }
    $lld_data = '{"data":[' + $($HDD_json -replace ',$') + ']}'
    return $lld_data
}


function GetSMARTStatus()
{
    $response = & $cli  -A $HDDid| where {$_ -match "^ *$SmartCode"} 
    if ($response -eq "" -or $response -eq $null)
    {
        $SMARTRes="0"
    }
    if ($response.Length -gt 87)
    {
        $SMARTRes = $response.Substring(87)
    }
    
    if ($SMARTRes.Contains("("))
    {
        
        $SMARTRes = $response.Substring(87,$response.IndexOf("(")-87)
    }
    return $SMARTRes
}




function GetPhysicalDriveStatus()
{
    [array]$response = & $cli  -H $HDDid 
    foreach ($item in $response)
    {
        if ($item.Contains("SMART overall-health self-assessment test result:"))
        {
            if ($item.Contains("PASSED"))
            {
                return "PASSED"
            }
            return "FAILED!"
        }
    }
    return "FAILED!"
}

switch($action){
    "lld" {
        switch($part){
            "HDD" { write-host $(LLDHDD) }
        }
    }
    "health" {
        switch($part) {
            "HDD" { write-host $(GetPhysicalDriveStatus $HDDid) }
        }
    }
    "state" {
        switch($part) {
            "SMART" { write-host $(GetSMARTStatus $HDDid $SmartCode) }
        }
    }
    default {Write-Host "ERROR: Wrong argument: use 'lld' or 'health'"}
}

Я немного изменил оригинал скрипта, автор почему-то использует smartctl-nc.exe. У меня он вообще ничего не выводит, я не понял, что это за экзешник. Я использовал обычный smartctl.exe. Сохраните скрипт и проверьте его работу. Для того, чтобы система разрешила выполнять неподписанные powershell скрипты, необходимо запустить консоль powershell от администратора и выполнить команду:

Set-ExecutionPolicy RemoteSigned

Если этого не сделать, будете получать ошибку при запуске скрипта на тему того, что выполнение скриптов запрещены для данной системы. Я сохранил скрипт в директорию C:\zabbix\windows.hdd.ps1. Проверим его работу. Запускаем консоль powershell и сам скрипт с разными параметрами.

Мониторинг SMART в windows

Все в порядке. Скрипт возвращает список дисков для автообнаружения и различные параметры для запроса. Теперь добавим в конфиг агента UserParameter.

UserParameter=ZScript[*],powershell -File C:\zabbix\windows.hdd.ps1 $1 $2 $3 $4

Не забудьте увеличить таймаут получения данных. По-умолчанию в zabbix стоит 3 секунды. Этого может не хватать. Я обычно ставлю 15 секунд.

Timeout=15

Перезапускаем службу агента и идем на сервер.

На сервере делать ничего не надо, так как все сделал за вас я :) Предлагаю готовый шаблон - zabbix-smart-win-template.xml.



 

Скачиваете и импортируете в свой сервер. У меня он работает на версии сервера 6.2. В шаблоне настроено автообнаружение дисков, создание итемов и триггеров. Все немного похоже на то, что есть для линукса, но тем не менее отличается, так как делалось в разное время и с разным настроением. В линуксе все более заморочено - сложные триггеры и итемы, которые добавил автор шаблона. Со временем понял, что это не особо надо и не стал заморачиваться с виндой, сделал все по проще, но тем не менее весь основной функционал присутствует.

Более того, в версию с windows я добавил триггер, который срабатывает, если диск исчезает из системы. У меня был один такой диск, который мог просто пропасть. Пришлось сделать оповещение. В linux у меня диски никогда не пропадали просто так, поэтому не догадался с свое время до такого триггера. Ниже список items шаблона.

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

И тут же триггеры.

Прототипы триггеров

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

Итог мониторинга за дисками в windows

В общем и целом ничего сложного. Настроить мониторинг SMART и температуры дисков в windows не на много сложнее, чем в linux. Хорошо, что есть одинаковый интерфейс с одним и тем же синтаксисом для обоих дисков. В windows 10 ко всему прочему, есть полноценная система ubuntu, можно было бы и без powershell обойтись, но получилось бы не универсальное решение. Данный способ работает на всех версиях windows, начиная с XP.

 

опять честно заимствованный материал. Решением на zabbix 6.2 воспользовался ничего не переделывая, только подставляя свои пути.

Теги
Прикрепление
hdd-smart-mon.xml (15.34 КБ)