Good articles https://serveradmin.ru/monitoring-smart-v-zabbix/#_SMART___Windows
Мониторинг SMART и температуры диска в Windows
Изначально в статье было рассказано только о мониторинге в системах linux. Со временем появилась необходимость настроить то же самое, только в Windows, поэтому решил не начинать новую статью, а дополнить текущую. Смысл дальнейших действий точно такой же, как и на linux. Для мониторинга за жесткими дисками, в том числе за температурой в windows, будем использовать smartmontools под windows. Скрипт для автообнаружения и формирования выдачи в zabbix будет работать на powershell.
Устанавливаем smartmontools. После установки рекомендую сразу проверить работу. Для этого открываем командную строку, переходим в директорию C:\Program Files\smartmontools\bin и выполняем:
# smartctl --scan-open
Вы должны увидеть список всех дисков в системе. Дальше можете посмотреть информацию о дисках, например так:
# smartctl -A /dev/sda # smartctl -i /dev/sda
Если все в порядке, информация о дисках выводится, продолжаем. Нам нужен скрипт для парсинга вывода. Я не стал придумывать свой, к тому же на powershell писать практически не умею, взял за основу готовый, который реализует тот же функционал, что описанный выше для linux.
param($1,$2)
# Автообнарежение дисков
# Ключ: discovery
if ($1 -eq "discovery") {
try {
$items = c:\"Program Files"\smartmontools\bin\smartctl --scan-open | where {$_ -match "/dev/sd"}
write-host -NoNewline "{"
write-host -NoNewline "`"data`":["
$n = 0
foreach ($obj in $items) {
if ((c:\"Program Files"\smartmontools\bin\smartctl -i $obj.substring(0,8) | where {$_ -match "SMART support is: Enabled"}) -ne $null) {
$n = $n + 1
If ($n -gt 1) {write-host -NoNewline ","}
$line = "{`"{#DISKID}`":`"" + ($obj.substring(5,3)) + "`"}"
write-host -NoNewline $line
}
}
write-host -NoNewline "]"
write-host -NoNewline "}"
}
catch {write-host $error;exit}
}
# Получение информации от дисков
# Ключи:
else {
try {
if ($2 -eq "status") {
$obj = c:\"Program Files"\smartmontools\bin\smartctl -H /dev/$1 | where {$_ -match "result:"}
$obj = $obj.substring(50)
}
elseif ($2 -eq "model") {
$obj = c:\"Program Files"\smartmontools\bin\smartctl -i /dev/$1 | where {$_ -match "Device Model:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "family") {
$obj = c:\"Program Files"\smartmontools\bin\smartctl -i /dev/$1 | where {$_ -match "Model Family:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "fw") {
$obj = c:\"Program Files"\smartmontools\bin\smartctl -i /dev/$1 | where {$_ -match "Firmware Version:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "serial") {
$obj = c:\"Program Files"\smartmontools\bin\smartctl -i /dev/$1 | where {$_ -match "Serial Number:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "capacity") {
$obj = c:\"Program Files"\smartmontools\bin\smartctl -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 {
$obj = c:\"Program Files"\smartmontools\bin\smartctl -A /dev/$1 | where {$_ -match "^ *$2"}
try {$obj = $obj.Substring(87,$obj.IndexOf("(")-87)}
catch {$obj = $obj.Substring(87)}
}}
catch {$obj = ""}
Write-Output $obj
}
Я немного изменил оригинал скрипта, автор почему-то использует smartctl-nc.exe. У меня он вообще ничего не выводит, я не понял, что это за экзешник. Я использовал обычный smartctl.exe. Сохраните скрипт и проверьте его работу. Для того, чтобы система разрешила выполнять неподписанные powershell скрипты, необходимо запустить консоль powershell от администратора и выполнить команду:
Set-ExecutionPolicy RemoteSigned
Если этого не сделать, будете получать ошибку при запуске скрипта на тему того, что выполнение скриптов запрещены для данной системы. Я сохранил скрипт в директорию C:\zabbix\windows.hdd.ps1. Проверим его работу. Запускаем консоль powershell и сам скрипт с разными параметрами.
Все в порядке. Скрипт возвращает список дисков для автообнаружения и различные параметры для запроса. Теперь добавим в конфиг агента UserParameter.
UserParameter=ZScript[*],powershell -File C:\zabbix\windows.hdd.ps1 "$1" "$2"
Не забудьте увеличить таймаут получения данных. По-умолчанию в zabbix стоит 3 секунды. Этого может не хватать. Я обычно ставлю 15 секунд.
Timeout=15
Перезапускаем службу агента и идем на сервер.
На сервере делать ничего не надо, так как все сделал за вас я :) Предлагаю готовый шаблон — zabbix-smart-win-template.xml. Скачиваете и импортируете в свой сервер. У меня он работает на версии сервера 3.4.6. В шаблоне настроено автообнаружение дисков, создание итемов и триггеров. Все немного похоже на то, что есть для линукса, но тем не менее отличается, так как делалось в разное время и с разным настроением. В линуксе все более заморочено — сложные триггеры и итемы, которые добавил автор шаблона. Со временем понял, что это не особо надо и не стал заморачиваться с виндой, сделал все по проще, но тем не менее весь основной функционал присутствует.
Более того, в версию с windows я добавил триггер, который срабатывает, если диск исчезает из системы. У меня был один такой диск, который мог просто пропасть. Пришлось сделать оповещение. В linux у меня диски никогда не пропадали просто так, поэтому не догадался с свое время до такого триггера. Ниже список items шаблона.

