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)
Gnom4ik Автор
25.12.2017 16:58Хм, не знаю. Почему не тривиальным? Я например в windows ну скажем так не спец и потому переношу свой опыт с linux, так сказать привычную мне среду обитания. Возможно вы скажете что WMI придумали не зря и вообще в windows много чего еще есть и я с вами соглашусь. Только один нюанс — я делаю мониторинг не для того чтобы сделать красивый мониторинг с
плюшкамии блекджеком с помощью встроенных возможностей windows, а изучаю python. Это мое хобби. С другой стороны я не вижу ничего плохого в том чтобы сделать обнаружения на python и делать это для production. Если есть что-то из разряда holly war — тут да, можно сказать что и слишком большой over head и вообще нужно использовать средства системы. Спорить не буду. Ну и поделиться своим опытом с сообществом — почему нет. Я вот например на просторах гугла не нашел такого же мониторинга для hdd как в linux под windows. Есть варианты очень уж громоздкие и в которых нужно знать столько всего про windows что зубы сводит, хотя учиться надо — это факт.Nexon
26.12.2017 09:02Да потому что у Zabbix LLD из коробки идет.
Gnom4ik Автор
27.12.2017 23:49Прошу прощения LLD чего именно? Да, есть встроенный функционал позволяющий из коробки обращаться к некоторым частям системы, причем более или менее любой системы. Если заббикс из коробки умеет получать данные smart то это совсем другое дели, но я не нашел такой информации… Поделитесь?
ATmegAdriVeR
25.12.2017 22:38Если не хочется изобретать велосипед, то для Windows есть отличная программа CrystalDiskInfo (распространяется под лицензией MIT). Умеет мониторить SMART и отсылать отчеты/предупреждения на e-mail. Пользуюсь больше года, самые положительные впечатления.
Gnom4ik Автор
25.12.2017 22:40Как я вижу — почта уже не то. У нас уже все в телеграм идет. Весьма удобно. Тут в принципе что кому нравится. Я пока остановился на варианте zabbix + python, все на эти рельсы перевожу.
rbobot
26.12.2017 08:26Какой-то жуткий оверкилл, вот мой пример решения этой задачи на powershell:
github.com/snd3r/GetDiskSmartNexon
26.12.2017 09:27Ставлю на то, что следующая статья будет о форке smartmontools с JSON-выхлопом для Zabbix.
Nexon
Это какой-то новый тренд на хабре? Почему вы все так хотите делать мониторинг самым нетривиальным способом? :D