Скачаем и установим нижеследующие программы.

Python 3.6.4
SMART montools

Не забудьте поменять %username% на имя пользователя в системе. Полный путь можно получить при установке Python 3.6.4

Не забудьте, что запускать установку нужно от лица администратора системы.

Код принимает два параметра из командной строки — имя диска и параметр который нужно вывести. В случае запуска без параметров — происходит обнаружение дисков и на выходе получаем готовый формат который принимает zabbix-server.

Выкладываем код в любую доступную вам директорию. Главное указать этот же путь в UserParameter

from subprocess import Popen, PIPE, check_output
import re
import json
import sys
import hashlib

path = '\"C:\\Program Files\\smartmontools\\bin\\smartctl\"'  # for linux use 'sudo smartctl'
smart_params = ['Model_Family', 'Device_Model', 'Serial_Number', 'test_result', 'Firmware_Version']  # if u need more # add ur data to this list
codec = 'windows-1252'  # for linux use utf8


def params(disk_name, raw_data=""):
    # Pars output from smartctl
    if raw_data not in smart_params and raw_data != "":
        # Pars smartctl data from sensors (smartctl -A /dev/sd*)
        out_data = re.findall(r'{}.*- *(\d+)'.format(raw_data),
                              Popen('{} -x /dev/{}'.format(path, disk_name), shell=True, stdout=PIPE,
                                    ).communicate()[0].decode(codec))
        return out_data[0]
    elif raw_data != "" and raw_data in smart_params:
        # Pars smartctl information about disks (smartctl -i /dev/sd*)
        out_data = re.findall(r'{}. *(.*)'.format(raw_data.replace('_', ' ')),
                              Popen('{} -x /dev/{}'.format(path, disk_name), shell=True, stdout=PIPE,
                                    ).communicate()[0].decode(codec))
        return out_data[0]
    elif raw_data == "":
        # check sum of smartctl --scan
        hash_object = hashlib.sha224(check_output(path + " --scan"))
        return hash_object.hexdigest()


try:
    # if no argumens from cli works as discovery
    try:
        if sys.argv[1] and sys.argv[2]:
            print(params(sys.argv[1], sys.argv[2]))
    except IndexError:
        print(params(sys.argv[1]))

except IndexError:
    # Discovery for disks
    data = check_output(path + " --scan").decode(codec)
    disks = set(re.findall(r'/dev/(.{3})', data))
    output = []

    for disk in disks:
        smart = check_output(path + " -i /dev/{}".format(disk)).decode(codec)
        if smart:
            output.append({"{#DISKNAME}": disk, "{#SMART_ENABLED}": "1"})
        else:
            output.append({"{#DISKNAME}": disk, "{#SMART_ENABLED}": "0"})
    output = {"data": output}
    print(json.dumps(output))

На наблюдаемый хост в zabbix-agentd.conf или, если у вас открыта секция Include то в определенный в ней файл, добавить UserParameters указанные ниже

UserParameter=uHDD.discovery,C:\\Users\\%username%\\AppData\\Local\\Programs\\Python\\Python36-32\\python.exe C:\\zabbix\\lld\\hdd_discovery.py
UserParameter=uHDD[*],C:\\Users\\%username%\\AppData\\Local\\Programs\\Python\\Python36-32\\python.exe C:\\zabbix\\lld\\hdd_discovery.py $1 $2

Добавление шаблона на сервер ''Zabbix''

Выложил на git — не думаю что вся репа очень позитивна — я учусь :)

Скачиваем шаблон — импортируем на сервер и добавляем на наблюдаемый хост.
Можно добавлять свои элементы данных. Логика такова — элемент данных отправляет параметры скрипту, который в свою очередь парсит вывод smartctl, если хотите что то добавить свое, нет проблем — в коде есть комментарии, которые помогут вам это сделать.

P.S. Скрипт для ленивых. С Linux уже как год работает такой же мониторинг таких же дисков, до Windows руки только дошли.

Комментарии (9)


  1. Nexon
    25.12.2017 16:53
    +1

    Это какой-то новый тренд на хабре? Почему вы все так хотите делать мониторинг самым нетривиальным способом? :D


  1. Gnom4ik Автор
    25.12.2017 16:58

    Хм, не знаю. Почему не тривиальным? Я например в windows ну скажем так не спец и потому переношу свой опыт с linux, так сказать привычную мне среду обитания. Возможно вы скажете что WMI придумали не зря и вообще в windows много чего еще есть и я с вами соглашусь. Только один нюанс — я делаю мониторинг не для того чтобы сделать красивый мониторинг с плюшками и блекджеком с помощью встроенных возможностей windows, а изучаю python. Это мое хобби. С другой стороны я не вижу ничего плохого в том чтобы сделать обнаружения на python и делать это для production. Если есть что-то из разряда holly war — тут да, можно сказать что и слишком большой over head и вообще нужно использовать средства системы. Спорить не буду. Ну и поделиться своим опытом с сообществом — почему нет. Я вот например на просторах гугла не нашел такого же мониторинга для hdd как в linux под windows. Есть варианты очень уж громоздкие и в которых нужно знать столько всего про windows что зубы сводит, хотя учиться надо — это факт.


    1. Nexon
      26.12.2017 09:02

      Да потому что у Zabbix LLD из коробки идет.


      1. Gnom4ik Автор
        27.12.2017 23:49

        Прошу прощения LLD чего именно? Да, есть встроенный функционал позволяющий из коробки обращаться к некоторым частям системы, причем более или менее любой системы. Если заббикс из коробки умеет получать данные smart то это совсем другое дели, но я не нашел такой информации… Поделитесь?


  1. ATmegAdriVeR
    25.12.2017 22:38

    Если не хочется изобретать велосипед, то для Windows есть отличная программа CrystalDiskInfo (распространяется под лицензией MIT). Умеет мониторить SMART и отсылать отчеты/предупреждения на e-mail. Пользуюсь больше года, самые положительные впечатления.


    1. Gnom4ik Автор
      25.12.2017 22:40

      Как я вижу — почта уже не то. У нас уже все в телеграм идет. Весьма удобно. Тут в принципе что кому нравится. Я пока остановился на варианте zabbix + python, все на эти рельсы перевожу.


    1. denaspireone
      27.12.2017 23:44

      Не заработал ваш софт у меня на RDP… imgur.com/D2F9F2l


  1. rbobot
    26.12.2017 08:26

    Какой-то жуткий оверкилл, вот мой пример решения этой задачи на powershell:
    github.com/snd3r/GetDiskSmart


    1. Nexon
      26.12.2017 09:27

      Ставлю на то, что следующая статья будет о форке smartmontools с JSON-выхлопом для Zabbix.