Home » Zabbix » Настройка мониторинга SMART жесткого диска в zabbix

Настройка мониторинга SMART жесткого диска в zabbix

Я рассмотрел на своем сайте много вариантов использования заббикс для наблюдения за различными метриками. Сейчас хочу рассказать, как настроить мониторинг SMART параметров жесткого диска с помощью Zabbix. Я давно использую это решение, но не писал статью, так как информация полностью мной заимствована. Но для полноты картины решил все же опубликовать на своем сайте.

Введение

Когда мне понадобилось настроить мониторинг жестких дисков, в частности, SMART параметров в Zabbix, я сразу же нашел готовое решение на share.zabbix.com. Рекомендую туда заглядывать периодически в поисках интересных приемов для мониторинга.

В данном случае практически не пришлось ничего менять или допиливать. И скрипты, и шаблон готов к использованию в оригинальном исполнении. Расскажу подробно, как я на основе этой информации настраиваю мониторинг smart у себя.

Я буду работать на сервере CentOS 7, но в данном случае, как обычно с заббиксом, это не имеет принципиального значения. Все скрипты и шаблоны подойдут для практически любого дистрибутива linux. Если у вас еще нет своего сервера для мониторинга, то рекомендую свои материалы на эту тему:

  1. Установка CentOS 7.
  2. Настройка CentOS 7.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 9, если предпочитаете его:

  1. Установка Debian 9.
  2. Базовая настройка Debian 9.
  3. Установка и настройка zabbix на debian.

Настраивать будем по этапам:

  1. Сначала настроим агент и все необходимые скрипты.
  2. Импортируем шаблон на сервер и применим к нужному хосту.
  3. Проверим полученные данные.

Приступим к настройке zabbix для наблюдения за смартом дисков.

У нас будет одна сложность, которая немного запутывает процесс настройки. Для версий 3.2 и ниже будут одни параметры и шаблон, а для 3.4 другие. Так как у меня есть обе версии серверов, мне придется рассмотреть настройку на обоих версиях.

Подготовка zabbix agent

Мониторинг значений SMART жесткого диска будет выполняться с помощью smartmontools. Установить их можно следующей командой для CentOS:

# yum install smartmontools

Либо аналогично в Debian/Ubuntu

# apt install smartmontools

Далее нам понадобится скрипт на perl для автообнаружения дисков и вывода информации о них в JSON формате, который понимает заббикс. Создадим такой скрипт.

# mcedit /etc/zabbix/scripts/smartctl-disks-discovery.pl
#!/usr/bin/perl

#must be run as root

$first = 1;

print "{\n";
print "\t\"data\":[\n\n";

for (`ls -l /dev/disk/by-id/ | cut -d"/" -f3 | sort -n | uniq -w 3`)
{
#DISK LOOP
$smart_avail=0;
$smart_enabled=0;
$smart_enable_tried=0;

#next when total 0 at output
        if ($_ eq "total 0\n")
                {
                        next;
                }

    print "\t,\n" if not $first;
    $first = 0;

$disk =$_;
chomp($disk);

#SMART STATUS LOOP
foreach(`smartctl -i /dev/$disk | grep SMART`)
{

$line=$_;

        # if SMART available -> continue
        if ($line = /Available/){
                $smart_avail=1;
                next;
                        }

        #if SMART is disabled then try to enable it (also offline tests etc)
        if ($line = /Disabled/ & $smart_enable_tried == 0){

                foreach(`smartctl -i /dev/$disk -s on -o on -S on | grep SMART`) {

                        if (/SMART Enabled/){
                                $smart_enabled=1;
                                next;
                        }
                }
        $smart_enable_tried=1;
        }

        if ($line = /Enabled/){
        $smart_enabled=1;
        }


}

    print "\t{\n";
    print "\t\t\"{#DISKNAME}\":\"$disk\",\n";
    print "\t\t\"{#SMART_ENABLED}\":\"$smart_enabled\"\n";
    print "\t}\n";

}

print "\n\t]\n";
print "}\n";

Сохраняем скрипт и делаем исполняемым.

# chmod u+x smartctl-disks-discovery.pl

Выполняем скрипт и проверяем вывод. Должно быть примерно так с двумя дисками.

{
	"data":[

	{
		"{#DISKNAME}":"sda",
		"{#SMART_ENABLED}":"1"
	}
	,
	{
		"{#DISKNAME}":"sdb",
		"{#SMART_ENABLED}":"1"
	}

	]
}

В данном случае у меня 2 физических диска — sda и sdb. Их мы и будем мониторить.

Настроим разрешение для пользователя zabbix на запуск этого скрипта, а заодно и smartctl, который нам понадобится дальше. Для этого запускаем утилиту для редактирования /etc/sudoers.

# visudo

Добавляем в самый конец еще одну строку:

zabbix ALL=(ALL) NOPASSWD:/usr/sbin/smartctl,/etc/zabbix/scripts/smartctl-disks-discovery.pl

Сохраняем, выходим 🙂 Это если вы умеете работать с vi. Если нет, то загуглите, как работать с этим редактором. Именно он запускается командой visudo.

Проверим, что пользователь zabbix нормально исполняет скрипт.

# chown zabbix:zabbix /etc/zabbix/scripts/smartctl-disks-discovery.pl
# sudo -u zabbix /etc/zabbix/scripts/smartctl-disks-discovery.pl

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

После настройки скрипта автообнаружения, добавим необходимые UserParameters для мониторинга SMART. Для этого создадим отдельный конфигурационный файл. Для версии 3.2 и ниже он будет выглядеть вот так.

# mcedit /etc/zabbix/zabbix_agentd.d/smart.conf
UserParameter=uHDD[*],sudo smartctl -A /dev/$1| grep -i "$2"| tail -1| cut -c 88-|cut -f1 -d' '
UserParameter=uHDD.model.[*],sudo smartctl -i /dev/$1 |grep -i "Device Model"| cut -f2 -d: |tr -d " "
UserParameter=uHDD.sn.[*],sudo smartctl -i /dev/$1 |grep -i "Serial Number"| cut -f2 -d: |tr -d " "
UserParameter=uHDD.health.[*],sudo smartctl -H /dev/$1 |grep -i "test"| cut -f2 -d: |tr -d " "
UserParameter=uHDD.errorlog.[*],sudo smartctl -l error /dev/$1 |grep -i "ATA Error Count"| cut -f2 -d: |tr -d " "
UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl

Версия настроек для агента 3.4

UserParameter=uHDD.A[*],sudo smartctl -A /dev/$1
UserParameter=uHDD.i[*],sudo smartctl -i /dev/$1
UserParameter=uHDD.health[*],sudo smartctl -H /dev/$1 || true
UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl

Сохраняем файл и перезапускаем zabbix-agent.

# systemctl restart zabbix-agent

Проверяем, как наш агент будет отдавать данные. Ключ uHDD.discovery будет одинаковый для обоих версий агента.

# zabbix_agentd -t uHDD.discovery

Вы должны увидеть полный JSON вывод с информацией о ваших диска. Теперь посмотрим, как передаются информация о smart. Запросим температуру дисков для версии 3.2.

# zabbix_agentd -t uHDD[sda,Temperature_Celsius]

uHDD[sda,Temperature_Celsius] [t|35]

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

Настройка мониторинга SMART параметров диска

На сервере нам никаких особенных настроек делать не придется. Достаточно будет загрузить готовый шаблон и применить его к интересующему нас хосту для мониторинга за диском.

Шаблон можно взять у меня — zabbix-smart-template.xml. Я уже точно не помню, изменял ли я что-нибудь в нем, по сравнению с оригинальным или нет. Но даже если и изменял, то незначительно, скорее всего только интервалы обновления итемов. Это шаблон я экспортировал со своего сервера версии 3.2. Оригинальные шаблоны вы можете взять у авторов по ссылке в начале поста.

Для сервера zabbix версии 3.4 используйте обновленный шаблон автора.

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

Правило автообнаружения дисков

Интервал автообнаружения

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

Мониторинг smart дисков

Может быть вам будет полезно чаще, чем раз в 10 минут мониторить температуру жесткого диска. В соседнем разделе посмотрите прототипы триггеров. Некоторые из них вычисляемые и начнут работать только после того, как накопится определенное количество данных. До этого они будут показывать ошибки, имейте это ввиду.

Важное замечание. Заметил уже во время написания статьи, что у меня триггер на температуру жесткого диска выставлен на значение, превышающее 52 градуса. Это достаточно много, но мне так было надо. Рекомендую снизить этот параметр до 50 или 45 градусов.

Триггер на мониторинг температуры диска

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

Мониторинг температуры жесткого диска

Мониторинг SMART и температуры диска в Windows

Изначально в статье было рассказано только о мониторинге в системах linux. Со временем появилась необходимость настроить то же самое, только в Windows, поэтому решил не начинать новую статью, а дополнить текущую. Смысл дальнейших действий точно такой же, как и на linux. Для мониторинга за жесткими дисками, в том числе за температурой в 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.

param($1,$2)

# Автообнарежение дисков
# Ключ: discovery
if ($1 -eq "discovery") {
try {
$items = smartctl --scan-open | where {$_ -match "/dev/sd"}

write-host -NoNewline "{"
write-host -NoNewline "`"data`":["

$n = 0
foreach ($obj in $items) {
 if ((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 {exit}
}

# Получение информации от дисков
# Ключи: 
else {
try {
if ($2 -eq "status") {
$obj = smartctl -H /dev/$1 | where {$_ -match "result:"}
$obj = $obj.substring(50)
}
elseif ($2 -eq "model") {
$obj = smartctl -i /dev/$1 | where {$_ -match "Device Model:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "family") {
$obj = smartctl -i /dev/$1 | where {$_ -match "Model Family:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "fw") {
$obj = smartctl -i /dev/$1 | where {$_ -match "Firmware Version:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "serial") {
$obj = smartctl -i /dev/$1 | where {$_ -match "Serial Number:"}
$obj = $obj.substring(18)
}
elseif ($2 -eq "capacity") {
$obj = 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 = 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 и сам скрипт с разными параметрами.

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

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

UserParameter=ZScript[*],powershell C:\zabbix\windows.hdd.ps1 "$1" "$2"

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

Timeout=15

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

На сервере делать ничего не надо, так как все сделал за вас я 🙂 Предлагаю готовый шаблон — zabbix-smart-win-template.xml. Скачиваете и импортируете в свой сервер. У меня он работает на версии сервера 3.4.6. В шаблоне настроено автообнаружение дисков, создание итемов и триггеров. Все немного похоже на то, что есть для линукса, но тем не менее отличается, так как делалось в разное время и с разным настроением. В линуксе все более заморочено — сложные триггеры и итемы, которые добавил автор шаблона. Со временем понял, что это не особо надо и не стал заморачиваться с виндой, сделал все по проще, но тем не менее весь основной функционал присутствует.

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

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

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

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

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

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

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

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Мониторинг smart значений жесткого диска достаточно полезная штука, но не стоит ей слепо доверять. У меня были ситуации, когда диски с Bad Sector Count работали годами. Тут важно смотреть на динамику и на статус сервера. Если он критичный, то при малейших признаках неисправности, я бы менял диск. Если это обычая файлопомойка с рейдом, то если диск не деградирует со временем, можно его не трогать.

Еще важный нюанс — подобный мониторинг жестких дисков возможен только если вы не используете raid контроллер. Если же он у вас есть, то чаще всего вы не сможете увидеть параметры smart дисков. Нужно будет использовать утилиты производителя raid контроллера и настраивать мониторинг через них.

Помогла статья? Есть возможность отблагодарить автора

51 комментарий

  1. Володя

    Решил попробовать сей интересный «рецепт» и добавить в ZABBIX полезного функционала, но споткнулся на на этапе добавления строчки: «zabbix ALL= (ALL) NOPASSWD: /usr/sbin/smartctl,/etc/zabbix/scripts/smartctl-disks-discovery.pl» через «visudo» и последующей проверкой. Собственно при проверке выдает «Permission denied».

  2. Для версии агента 3.4 скрипт smartctl-disks-discovery.pl под пользователем zabbix заработал только после небольшой правки.

    было
    # agent v.3.4
    #UserParameter=uHDD.A[*],sudo smartctl -A $1
    #UserParameter=uHDD.i[*],sudo smartctl -i $1
    #UserParameter=uHDD.health[*],sudo smartctl -H $1 || true
    #UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl

    стало
    # agent v.3.4
    UserParameter=uHDD.A[*],sudo smartctl -A /dev/$1
    UserParameter=uHDD.i[*],sudo smartctl -i /dev/$1
    UserParameter=uHDD.health[*],sudo smartctl -H /dev/$1 || true
    UserParameter=uHDD.discovery,sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl

  3. Для Windows как можно организовать, есть статьи у Вас ?

  4. Интересно когда проверяю с помощью zabbix агента uHDD.discovery, то выводится JSON с информацией о дисках. А когда проверяю температуру дисков, то выдает:
    uHDD[sda,Temperature_Celsius] [m|ZBX_NOTSUPPORTED] [Unsupported item key.]

    При помощи «smartctl -d ata -A /dev/sda | grep -i temperature» температура дисков отображается нормально:
    194 Temperature_Celsius 0x0002 171 171 000 Old_age Always — 35 (Min/Max 21/62)

    Версия агента 4.0.0alpha2.

    • Zerox

      Альфа как бы намекает 🙂 Вообще, я был неприятно удивлен, что некоторые мои скрипты и UserParameter перестали работать после обновления с 3.2 -> 3.4. Так что и тут могут быть нюансы.

  5. Подскажите у меня вот такая ошибка,в правиле обнаружения «Value should be a JSON object.»

  6. 2 Reliseeon:

    то-же самое на zabbix 3.5. я с zabbix на Вы. Куда копать, подскажите.

  7. Владимир

    Добрый день, спасибо за отличный мануал.
    Но есть вопрос по ошибке «Value should be a JSON object.» заббикс 3.4
    подскажите пожалуйста что делать.

  8. Дмитрий

    А есть ли у вас ХМЛ для 3.2 забикса, а то данный для 3.4 не подходит, выдает ошибку.

    • Zerox

      К сожалению, нет. Я бы рекомендовал обновиться, там все очень просто. С проблемами я ни разу не сталкивался.

  9. Возможно проблема в шаблоне т.к. с оригинальным шаблоном ошибки Value should be a JSON object нет
    https://habr.com/post/322668/#Changelog

    • Zerox

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

  10. Скажите пожалуйста , есть разница какой агент используется? активный или пасивный

    • Zerox

      По идее нет. Мне сходу в голову не приходит идеи, почему может не работать.

      • Я извиняюсь за такой вопрос, нашел на форме zabbix там предложили одно из решений, но написано что только активный!
        Просто у меня была проблема : скрипт не запускается если он лежит в program files, переложил его и все хорошо работает !
        Спасибо вам за этот метод!
        Выяснил тут один факт:
        Reallocated Sectors Count — говорит 0 , а если смотреть через crystalDiskInfo говорит 140 и ошибка позиционирования тоже есть но шаблон говорит 0 .

  11. на windows машине настроил по вашей инструкции. использовал ваши шаблоны. zabbix 3.4
    данных на хосте нет. куда копать?

  12. Вот и у меня в шаблоне в элементах данных пусто и ничего не мониторится. Как их туда добавить?

  13. На виндовых серваках не работает, даже данные не цепляет через шаблон, что за лажа !!!!!!!!!!!!!!!!!!!!!!!!!!!!

    • Zerox

      Буквально сегодня получал алерты от сервера, настроенного по этой статье. Так что надо внимательно разбираться, способ описан рабочий. Я сам по своим статьям настраиваю сервера по работе.

  14. Добрый день.
    Такая же ситуация с win сервером (2008) .
    Скрипт через powershell всё отрабатывает. Данные выводятся.
    PS C:\zabbix> .\windows.hdd.ps1 «discovery»
    {«data»:[{«{#DISKID}»:»sda»},{«{#DISKID}»:»sdb»},{«{#DISKID}»:»sdc»},{«{#DISKID}»:»sdd»}]}PS C:\zabbix>

    На zabbix-сервере (3.4.10) в обнаружении » Value should be a JSON »
    Через zabbix_get запрос возвращается пустое значение.

    В режиме DebugLevel=4 в логе можно найти это :

    EXECUTE_STR() command:’powershell C:\zabbix\windows.hdd.ps1 «discovery» «»‘ len:0 cmd_result:»
    Sending back []

    Подскажите — в чём ещё может быть проблемам ?
    Можно выложить скрипт и шаблон в файле ? Во избежании проблемы с копипастой.

    • Zerox

      Вот файл с рабочего сервера:
      https://yadi.sk/d/8respft_3XL3vx
      Не понимаю, что там с пустыми строками. Выглядит он странно, но факт в том, что в таком виде он и работает. Когда настраивал, понятное дело, все выглядело как и должно, без кучи пустых строк.

    • Добрый день,

      Скрипт через powershell всё отрабатывает. Данные выводятся.
      PS C:\zabbix> .\windows.hdd.ps1 «discovery»
      {«data»:[{«{#DISKID}»:»sda»},{«{#DISKID}»:»sdb»},{«{#DISKID}»:»sdc»},{«{#DISKID}»:»sdd»}]}PS C:\zabbix>

      вы это делаете с параметром discovery дописывая или по нажатию выполнить ?

      Я например если нижымаю выполнить у меня пустая строка а если допишу

      .\windows.hdd.ps1 discovery

      PS C:\> .\windows.hdd.ps1 discovery
      {«data»:[]}PS C:\>

      то только тогда получаю вывод не из за этго ли ошибка Value should be a JSON

      • Параметр discovery zabbix-сервер передаёт скрипту (насколько я понимаю) .

        Вы верно написали . если просто запустить скрипт — он ничего не выводит .
        PS C:\zabbix> .\windows.hdd.ps1

        PS C:\zabbix>

        Если его запустить с параметром discovery

        PS C:\zabbix> .\windows.hdd.ps1 discovery
        {«data»:[{«{#DISKID}»:»sda»},{«{#DISKID}»:»sdb»},{«{#DISKID}»:»sdc»},{«{#DISKID}»:»sdd»}]}PS C:\zabbix

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

        • а где тема?прошу прощения

        • для проверки работы скрипта его надо запускать не из поша, а из cmd:
          powershell -File [c:\путь к фалу] discovery
          При этом надо удостовериться, что диски у вас именно ata, у меня на тестовой машине были sat, и я искал проблему пару часов, пока не понял, в чем причина.
          smartctl —scan-open должна показать типы дисков. Если они не ata, то в скрипте дописываете параметр -d sat или -d scsi или еще что, в зависимости от вывода скан-опен. Так же у меня была проблема с правами учетной записи, от имени которой запускался скрипт, этот момент тоже проверьте.

    • Теперь нужно внести коррективы в строку «PATH» системных переменных. Для этого открываем «Панель управления – Система и безопасность – Система – Дополнительные параметры – Переменные среды» и переходим в «Системные переменные» (нижняя часть). Далее ищем там строку под названием «PATH» и добавляем (двойной щелчок или нажимаем кнопку «Изменить») в конец следующие параметры «%systemroot%\System32\WindowsPowerShell\v1.0\;» и «C:\Program Files\smartmontools\bin» разделяя их (без пробелов!!!) точкой с запятой!

      В итоге у нас ВСЯ строка будет выглядеть так:
      %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%systemroot%\System32\WindowsPowerShell\v1.0\;C:\Program Files\smartmontools\bin

      Для того чтобы изменения вступили в силу – нужно перезагрузить «машину»

  15. Заметил, что ошибка Value should be a JSON появляется если заббикс-агент запущен с системной учетной записью
    если запускать с учеткой с правами админа, то все нормально
    такое ощущение что powershell скрипт выполненный под системной учеткой не отдает в консоль ответ, или не имеет на это права

    • А ларчик то просто открывался .
      Да . Работает.
      Огромное спасибо за совет!

    • Надо просто добавить в глобальную переменную PATH путь до smartmontools

      • Zerox

        Все верно. Неужели забыл сказать об этом в статье? Сам я точно помню, что делал это.

    • Александр

      Здравствуйте.
      Никак не могу настроить мониторинг SMART. Проблема как у многих Value should be a JSON.
      Скрипт работает четко, выводит в консоль правильный JSON.
      Переменная PATH до smartmontools добавлена.
      Есть идеи куда еще капнуть?

      Что интересно, у меня работает похожий скрипт для определения кол-ва cpu на компе.
      И нет никаких проблем.

    • Теперь нужно внести коррективы в строку «PATH» системных переменных. Для этого открываем «Панель управления – Система и безопасность – Система – Дополнительные параметры – Переменные среды» и переходим в «Системные переменные» (нижняя часть). Далее ищем там строку под названием «PATH» и добавляем (двойной щелчок или нажимаем кнопку «Изменить») в конец следующие параметры «%systemroot%\System32\WindowsPowerShell\v1.0\;» и «C:\Program Files\smartmontools\bin» разделяя их (без пробелов!!!) точкой с запятой!

      В итоге у нас ВСЯ строка будет выглядеть так:
      %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%systemroot%\System32\WindowsPowerShell\v1.0\;C:\Program Files\smartmontools\bin

      Для того чтобы изменения вступили в силу – нужно перезагрузить «машину»

  16. В perl скрипте лучше получать список блочных устройств не
    for (`ls -l /dev/disk/by-id/ | cut -d»/» -f3 | sort -n | uniq -w 3`)
    а
    for (`llsblk -r | awk ‘$6 == «disk» {print $1}’`)

  17. Или более лаконично:
    for (`lsblk -r -o NAME,TYPE | awk ‘$2 == «disk» {print $1}’`)

  18. После примерно недели танцев с бубном я-таки запустил это. Но:
    1) в userparameter файла zabbix_agetnd.cinf надо вписывать не ту строку, как указано, а
    ZScript[*],powershell -File [путь к файлу-скрипту *.ps1] «$1» «$2»
    Иначе это не работает.
    2) одного скрипта мне было недостаточно, так как он не может работать не с ata дисками, чтобы он умел работать с sat дисками, его надо скопировать, и добавить в команды к smartctl ключ -d sat, иначе он их просто не найдет. Так же можно сделать еще и для scsi дисков, но скорее всего они будут в raid, и до них все равно не достучаться, так что это избыточность. После чего надо добавить в userparameter еще один скрипт новой строкой и рестартануть службу zabbix agent. У себя я использовал для всего этого Kix.
    3) переменная path не нужна, если: в скрипте поменять smartctl на полный путь к файлу c:\smartmontools\smartctl.exe к примеру. И в этом случае можно просто скриптом раскидать на все нужные ПК папку с дистрибутивом smartmontools x32 версии и обращаться к ней в скрипте. у меня в сети есть как х32 так и х64 ОСи, так что я взял распакованную х32 прогу и стартовым скриптом рассовал ее по всем машинам.
    4) шаблон так же надо скопировать, переименовать и переделать для sat дисков. Для этого можно открыть его блокнотом и автозаменой пройтись по ZScript заменив на ZScript_sat к примеру. Так же в шаблоне косяк с триггерами, у них нет выражения восстановления. То есть если они сработали, то они не исчезнут до тех пор, пока не будет отключен хост и не будут удалены его данные по таймауту, указанному в прототипе элемента данных. Прототипы триггреов независимы, даже на один и тот же элемент данных. Это все тоже пришлось править. Мелочи, но когда из прототипов будут делаться элементы и триггеры их придется править вручную, а если хостов, как у меня в сети, 700 штук — это уже проблема.
    5) чтобы диски начали обнаруживаться, надо хосты прицепить к шаблонам (это и так понятно, но мало ли). В виртуалках это не будет работать по понятным причинам отсутствия raid в виртуальных дисках. С raid-контроллерами smartmontools так же работать не умеет, что логично. У меня она даже статус smart не смогла считать. Тут можно прикрутить к Заббиксу мониторинг ssh, но это совершенно другая история

    • Zerox

      Спасибо за полезную инфу. Такого рода настройки никогда не работают из коробки для всех. Очень много нюансов. Это скорее план к действию с чужим опытом. А на месте уже вносятся свои правки.

      • Конечно! Я потому и отписал все свои злоключения, чтобы кому-то помочь и упростить жизнь.
        BTW, спасибо за статью.

    • Уважаемый SnowBars!
      Поделитесь, пожалуйста своими рабочими (модифицированными) скриптами и шаблоном!

  19. Спасибо за отличную статью!

    Внес немного правок
    1) Поскольку в пути к з\а есть пробел, моя строка в userparameter файле выглядит так:
    UserParameter=ZScript[*],powershell.exe -file «C:\Program Files\Zabbix_Agent\scripts\windows.hdd.ps1» «$1» «$2»

    2) Дабы всё работало, когда агент запущен под «local system», чуть поправил ps1 файл:
    в начале объявим «$smartctl=’C:\Program Files\smartmontools\bin\smartctl.exe'»
    а после заменим все вхождеия «smartctl» на «& smartctl»
    ИМХО это сделало скрипт чуть более универсальным.

    Ну и для удобства дебагинга в отловке ошибок «catch {write-host $error;exit}» вместо «catch {exit}».
    Тогда и стало понятно, что local system не видит systemctl.

  20. Спасибо всем за отличную статью.
    Использую скрипт уважаемого SnowBars

    При запуске скрипта ошибки такого вида:
    \SmartScanZabbixAgent.ps1:7 char:22
    + $items = $smartctl —scan-open | where {$_ -match «/dev/sd»}
    + ~~~~~~~~~
    Unexpected token ‘scan-open’ in expression or statement.
    At SmartScanZabbixAgent.ps1:14 char:17
    + if (($smartctl -i -d sat $obj.substring(0,8) | where {$_ -match «SMART support …
    + ~~
    Unexpected token ‘-i’ in expression or statement.
    At SmartScanZabbixAgent.ps1:14 char:20
    + if (($smartctl -i -d sat $obj.substring(0,8) | where {$_ -match «SMART support …
    + ~~
    Unexpected token ‘-d’ in expression or statement.
    At SmartScanZabbixAgent.ps1:14 char:19
    + if (($smartctl -i -d sat $obj.substring(0,8) | where {$_ -match «SMART support …
    + ~
    Missing closing ‘)’ in expression.
    At SmartScanZabbixAgent.ps1:14 char:23
    + if (($smartctl -i -d sat $obj.substring(0,8) | where {$_ -match «SMART support …
    + ~~~
    Unexpected token ‘sat’ in expression or statement.
    At SmartScanZabbixAgent.ps1:14 char:23
    + if (($smartctl -i -d sat $obj.substring(0,8) | where {$_ -match «SMART support …
    + ~~~
    Missing closing ‘)’ after expression in ‘if’ statement.
    At SmartScanZabbixAgent.ps1:13 char:26
    + foreach ($obj in $items) {
    + ~
    Missing closing ‘}’ in statement block.
    At SmartScanZabbixAgent.ps1:6 char:5
    + try {
    + ~
    Missing closing ‘}’ in statement block.
    At SmartScanZabbixAgent.ps1:14 char:94
    + … t is: Enabled»}) -ne $null) {
    + ~
    The Try statement is missing its Catch or Finally block.
    At SmartScanZabbixAgent.ps1:5 char:25
    + if ($1 -eq «discovery») {
    + ~
    Missing closing ‘}’ in statement block.
    Not all parse errors were reported. Correct the reported errors and try again.
    + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

    Кто-нибудь с таким ?

    Если кому интересно. Сам скрипт вот https://yadi.sk/d/_9-67CqQCW9K-g

  21. Для того чтобы ошибка «Value should be a JSON object» исчезла и данные по «Windows-дискам» начали поступать в систему мониторинга, прошу автора данной статьи внести следующие коррективы в раздел «Мониторинг SMART и температуры диска в Windows».

    1. После слов «Timeout=15» добавить текст:
    «Теперь нужно внести коррективы в строку «PATH» системных переменных. Для этого открываем «Панель управления – Система и безопасность – Система – Дополнительные параметры – Переменные среды» и переходим в «Системные переменные» (нижняя часть). Далее ищем там строку под названием «PATH» и добавляем (двойной щелчок или нажимаем кнопку «Изменить») в конец следующие параметры «%systemroot%\System32\WindowsPowerShell\v1.0\;» и «C:\Program Files\smartmontools\bin» разделяя их (без пробелов!!!) точкой с запятой!

    В итоге у нас ВСЯ строка будет выглядеть так:
    %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%systemroot%\System32\WindowsPowerShell\v1.0\;C:\Program Files\smartmontools\bin

    Для того чтобы изменения вступили в силу – нужно перезагрузить «машину» (компьютер/ноутбук).

    Далее идем на сервер Zabbix и проверяем предоставление Zabbix-агентом результатов работы нашего PowerShell-скрипта. Для этого запускаем терминал и вводим следующие команды:

    sudo zabbix_get -s «192.168.25.11» -k ZScript[sda,status]

    sudo zabbix_get -s «192.168.25.11» -k ZScript[sda,capacity]

    где 192.168.25.11 – адрес нашего клиентского компьютера под ОС «Windows», на котором мы только что настроили Zabbix-агент.

    Результатом успешного выполнения приведённых выше команд будет отображение статуса и объёма Вашего диска клиентского компьютера.

    2. Далее заменяем предложение «На сервере делать ничего не надо, так как все сделал за вас я.» на «После этого заходим в веб-интерфейс управления Zabbix-сервера и импортируем нужный нам шаблон.»

    Сам бился над этой проблемой не одну неделю. Потом ввёл в терминале Zabbix-сервера команды:
    sudo zabbix_get -s «192.168.25.11» -k ZScript[sda,status]

    sudo zabbix_get -s «192.168.25.11» -k ZScript[sda,capacity]

    В результате они постоянно выдавали мне непонятные «крякозябры». Чтобы понять, в чём же дело, перенаправил их вывод в отдельный текстовый файл. Затем скопировал его на компьютер с ОС «Windows» и с помощью программы «AkelPad» подобрал правильную кодировку – ею оказалась кодировка «OEM-866». В итоге получил такой текст «»powershell» не является внутренней или внешней командой, исполняемой программой или пакетным файлом.»

    Так что НИКАКИХ изменений ни в шаблон и ни PowerShell-скрипт для «мониторинга SMART и температуры диска в Windows» вносить НЕ НУЖНО, Необходимо лишь добавить только два параметра в строку «PATH» «Системных переменных» (см. выше).

    Спасибо за понимание!

  22. Более простое и элегантное решение этой задачи тут:
    «Zabbix: LLD-мониторинг дисков без UserParameter и скриптов на агентах»
    https://habr.com/post/344548/

Добавить комментарий

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.