Zabbix мониторинг дисков windows

Время на прочтение3 мин

Количество просмотров11K

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

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 руки только дошли.

Для того, чтобы при помощи активного агента Zabbix следить за дисковым пространством компьютера, как оказалось, не нужно писать скриптов. Совсем. 🙂 Все уже умеет делать активный Zabbix-агент «из коробки». Достаточно создать шаблон и назначить его компьютеру. Всё.

А теперь по порядку.

Дано.

Сферический компьютер в вакууме. Нужно следить за заполненностью системного диска Windows. Предположим, что у нас всё стандартно, поэтому в качестве буквы системного диска используется «C:».

Решение.

При помощи активного агента Zabbix будем собирать 4 параметра диска «C:»:

  • общий размер диска
  • размер занятого места
  • размер свободного места
  • процент свободного места.

На основании этих параметров создадим 4 триггера:

  • Предупреждение. Свободно менее 20%
  • Средняя важность. Свободно менее 10%
  • Высокая важность.  Свободно менее 1 Гб.
  • Чрезвычайная важность. Свободно менее 100 Мб.

И создадим 2 графика:

  • Размер свободного места
  • Размер свободного места в процентах.

Создаём шаблон.

Имя шаблона: Active Computer — SystemDrive
Группа данных: Filesystems
Элементы данных:

  • SystemDriveSizeFree — vfs.fs.size[«c:»,free]
  • SystemDriveSizePFree — vfs.fs.size[«c:»,pfree]
  • SystemDriveSizeTotal — vfs.fs.size[«c:»,total]
  • SystemDriveSizeUsed — vfs.fs.size[«c:»,used]

Триггеры:

  • Предупреждение. Меньше 20% свободно на системном диске компьютера {HOST.NAME} {Active Computer — SystemDrive:vfs.fs.size[«c:»,pfree].last()}<20
  • Средняя .Меньше 10% свободно на системном диске компьютера {HOST.NAME} {Active Computer — SystemDrive:vfs.fs.size[«c:»,pfree].last()}<10
  • Высокая. Меньше 1ГБ свободно на системном диске компьютера {HOST.NAME} {Active Computer — SystemDrive:vfs.fs.size[«c:»,free].last()}<1073741824
  • Чрезвычайная. Меньше 100 Мб свободно на системном диске компьютера {HOST.NAME} {Active Computer — SystemDrive:vfs.fs.size[«c:»,free].last()}<104857600

Теперь то же самое, но в картинках.















Файл с  экспортированным шаблоном можно скачать тут: zbx_export_templates_Active_Computer_SystemDrive.xml

Назначаем шаблон компьютеру

И начинаем получать данные… 🙂

Ура!!!

Всё работает.


zabbix-smartmontools

Features

Cross-platform SMART monitoring scripts with two display modes: device and serial. LLD discovers and sends data in one pass, using minimal number of utilities. Supports any SMART name and displays it as is.

  • Utilises smartctl error return codes
  • Low-Level Discovery
  • SAS support
  • SSD wear monitoring (SAS only)
  • csmi support
  • Efficient: no unnecessary processes are spawned
  • Bulk items upload with zabbix-sender
  • Error-proof configuration: various safeguard triggers
  • Automatic RAID passthrough (when smartctl detects the drives)

Note: disk temperature is monitored using different approach.

Triggers

Triggers-Discovery2

More disk triggers

Disk items

Template triggers

Triggers that contain delta(5d)>0 and last()>0 will fire on any change unless last value is zero. E.g. when disk is replaced with zero values the trigger will not fire, but if value is less or more — it will. Therefore, replacing a faulty drive with faulty one will still trigger a problem that stays for 5 days (default).

Installation

As prerequisites you need python3, smartmontools, sudo and zabbix-sender packages. For testing, zabbix-get is also required.

Take a look at scripts first lines and provide paths if needed. If you have a RAID configuration, also provide that manually. Choose device or serial mode at the top of the script. Import Template_App_smartmontools.xml in zabbix web interface.

Prerequisites

Repository installation

Debian

client# apt-get install zabbix-agent zabbix-sender smartmontools sudo
server# apt-get install zabbix-get   # testing

Centos

client# yum install zabbix-agent zabbix-sender smartmontools sudo
server# yum install zabbix-get   # testing

Placing the files

Note: Your include directory may be either zabbix_agentd.d or zabbix_agentd.conf.d dependent on the distribution.

Linux

client# mv smartctl-lld.py sender_wrapper.py /etc/zabbix/scripts/
client# mv sudoers.d/zabbix /etc/sudoers.d/   # place sudoers include for smartctl sudo access
client# mv userparameter_smartctl.conf /etc/zabbix/zabbix_agentd.d/   # move zabbix items include here

FreeBSD

client# mv smartctl-lld.py sender_wrapper.py /usr/local/etc/zabbix/scripts/
client# mv sudoers.d/zabbix /usr/local/etc/sudoers.d/
client# mv userparameter_smartctl.conf /usr/local/etc/zabbix/zabbix_agentd.d/

Windows

client> move smartctl-lld.py "C:\Program Files\Zabbix Agent\scripts\"
client> move sender_wrapper.py "C:\Program Files\Zabbix Agent\scripts\"
client> move userparameter_smartctl.conf "C:\Program Files\Zabbix Agent\zabbix_agentd.d\"

Install python3 for all users, adding it to PATH during installation. Install smartmontools and add its bin folder to PATH in environment variables (or specify absolute path to smartctl binary in smartctl-lld.py).

Finalizing

Dependent on the distribution, you may need to include your zabbix conf folder in zabbix_agentd.conf, like this:

Include=/usr/local/etc/zabbix/zabbix_agentd.d/

Its recomended to add at least Timeout=10 to agent and server config files to allow drives spun up in some cases.

Thats all for Windows. For others run the following to finish configuration:

client# chmod 755 smartctl-lld.py sender_wrapper.py   # apply necessary permissions
client# chown root:zabbix smartctl-lld.py sender_wrapper.py
client# chmod 644 userparameter_smartctl.conf
client# chown root:zabbix userparameter_smartctl.conf
client# chmod 400 sudoers.d/zabbix
client# chown root sudoers.d/zabbix
client# visudo   # test sudoers configuration, type :q! to exit

Testing

server$ zabbix_get -s 192.0.2.1 -k smartctl.discovery[get,"Example host"]

Default operation mode. Displays json that server should get, detaches, then waits and sends data with zabbix-sender. Example host is your Host name field in zabbix.

server$ zabbix_get -s 192.0.2.1 -k smartctl.discovery[getverb,"Example host"]

or locally:

client$ /etc/zabbix/scripts/smartctl-lld.py getverb "Example host"
client_admin!_console> python "C:\Program Files\Zabbix Agent\scripts\smartctl-lld.py" getverb "Example host"

Verbose mode. Does not detaches or prints LLD. Lists all items sent to zabbix-sender, also it is possible to see sender output in this mode.

Note: before scripts would work, zabbix server must first discover available items. It is done in 12 hour cycles by default. You can temporary decrease this parameter for testing in template -> Discovery -> SMART disk discovery -> Update interval.

These scripts were tested to work with following configurations:

  • Debian 11 / Server (5.0, 6.0) / Agent 4.0 / Python 3.9
  • Ubuntu 22.04 / Server (5.0, 6.0) / Agent 5.0 / Python 3.10
  • Windows Server 2012 / Server 6.0 / Agent 4.0 / Python (3.7, 3.11)
  • Windows 10 / Server 6.0 / Agent 4.0 / Python (3.10, 3.11)
  • Windows 7 / Server 6.0 / Agent 4.0 / Python (3.4, 3.7, 3.8)
  • Centos 7 / Zabbix 3.0 / Python 3.6
  • FreeBSD 10.3 / Zabbix 3.0 / Python 3.6
  • Windows XP / Zabbix 3.0 / Python 3.4

Updating

Overwrite scripts and UserParameters. If UserParameters were changed — agent restart is required. If template had changed from previous version — update it in zabbix web interface marking all Delete missing checkboxes.

Note: low values in php settings /etc/httpd/conf.d/zabbix.conf may result in request failure. Especially php_value memory_limit.

FAQ

Q: Trigger fires when it clearly shouldn’t.
Q: Trigger’s macro does not expand.
Q: Triggers from older version does not expire after update.
A: Reassign the template with Unlink and clear on the host for individual resolution. Or reupload the tempate marking all Delete missing checkboxes.

Q: Is it possible to monitor specific drives or exclude some of them?
Q: SCSI drive returns empty results while -A option working correctly.
A: Specify diskListManual in smartctl-lld.py:

diskListManual = ['/dev/sda -d sat+megaraid,4', '/dev/sda -d sat+megaraid,5']
diskListManual = ['/dev/csmi0,0 -d scsi', '/dev/csmi0,1 -d scsi']

Q: Old triggers are misleading after disk replacement.
A: Wait for 24 hours (default) or perform Unlink and clear on the host. You can also adjust the interval at template -> Discovery -> SMART disk discovery -> Keep lost resources period.

Q: Triggers Command line did not parse and Device open failed serves identical purpose in zabbix-smartmontools and zabbix-mini-IPMI.
A: Disable unneeded pair in either template.

Q: Script exits with exception/error.
A: Report it.

Known issues

  • Zabbix web panel displays an error on json discovery, but everything works fine (#7)
  • Data on some systems may be absent right after boot due to ACHI warmup (#14)
  • Windows version does not detaches, and data will only be gathered on second pass

Planned features

  • SSD life monitoring (SATA)
  • ERC / TLER / CCTL is-enabled check

Links

  • https://www.smartmontools.org
  • https://unlicense.org
  • The 5 SMART stats that actually predict hard drive failure
  • What SMART Stats Tell Us About Hard Drives
  • SMART attributes detailed explanation
  • Оцениваем состояние жёстких дисков при помощи S.M.A.R.T. (Russian)
  • Disk and CPU temperature monitoring solution

В этой статье мы пошагово разберём, как настроить мониторинг состояния жёстких дисков с использованием технологии SMART (Self-Monitoring, Analysis and Reporting Technology) в системе мониторинга Zabbix. Мы рассмотрим установку необходимых инструментов, настройку Zabbix-агента, создание шаблонов и триггеров, а также проверим работоспособность мониторинга.


Введение

Технология SMART предназначена для самодиагностики жёстких дисков, отслеживания их состояния и прогнозирования возможных сбоев. Используя интеграцию SMART с Zabbix, можно автоматизировать сбор данных о состоянии дисков, отправлять уведомления о проблемах и предотвращать потерю данных.


Шаг 1: Установка Необходимых Инструментов

Для начала установим утилиту smartmontools, необходимую для работы с SMART.

Для Debian/Ubuntu:

sudo apt update
sudo apt install smartmontools

Для CentOS/Rocky Linux:

sudo yum install smartmontools

Проверка версии установленного пакета:

smartctl --version

Шаг 2: Проверка Состояния Диска

Прежде чем приступить к настройке мониторинга, проверим поддержку SMART на вашем диске.

Проверяем наличие поддержки SMART:

sudo smartctl -i /dev/sda

Вывод должен содержать строку вроде: SMART support is: Available или Enabled. Если поддержка отсутствует, её можно включить:

sudo smartctl -s on /dev/sda

Далее проверим текущее состояние диска:

sudo smartctl -a /dev/sda

Этот вывод содержит важные атрибуты, такие как температура, количество ошибок чтения/записи и общее состояние диска.


Шаг 3: Настройка Zabbix-Агента

Теперь настроим Zabbix-агент для сбора данных SMART.

Установка Zabbix-агента (если ещё не установлен):

Для Debian/Ubuntu:

sudo apt install zabbix-agent

Для CentOS/Rocky Linux:

sudo yum install zabbix-agent

Редактирование конфигурационного файла агента:

sudo nano /etc/zabbix/zabbix_agentd.conf

Добавляем или изменяем следующие параметры:

Server=<IP_ZABBIX_SERVER>
ServerActive=<IP_ZABBIX_SERVER>
Hostname=<Имя_хоста>

Где <IP_ZABBIX_SERVER> заменяется на IP-адрес сервера Zabbix, а <Имя_хоста> — на уникальное имя хоста.

Перезапускаем агент:

sudo systemctl restart zabbix-agent

Шаг 4: Добавление Пользовательских Параметров в Zabbix-Агент

Для сбора данных SMART добавим пользовательские параметры в конфигурацию Zabbix-агента.

Открываем файл конфигурации:

sudo nano /etc/zabbix/zabbix_agentd.conf

Добавляем следующие строки:

### SMART Monitoring Parameters ###
UserParameter=smart.health[*], sudo /usr/sbin/smartctl -H /dev/$1 | grep -q "PASSED\|OK" && echo 1 || echo 0
UserParameter=smart.temperature[*], sudo /usr/sbin/smartctl -A /dev/$1 | grep -E "Temperature_Celsius|Airflow_Temperature_Cel" | awk '{print $$10}'
UserParameter=smart.attributes[*], sudo /usr/sbin/smartctl -A /dev/$1 | grep "$2" | awk '{print $$10}'

Параметры означают следующее:

  • smart.health[*]: проверка общего состояния диска (1 — PASSED, 0 — FAILED);
  • smart.temperature[*]: получение текущей температуры диска;
  • smart.attributes[*]: получение значений конкретных атрибутов SMART.

Сохраняем файл и перезапускаем агент:

sudo systemctl restart zabbix-agent

Шаг 5: Настройка Прав Доступа для Zabbix-Агента

Для выполнения команд smartctl с привилегиями sudo добавляем запись в файл /etc/sudoers.

Открываем файл:

sudo visudo

Добавляем строку:

zabbix ALL=(ALL) NOPASSWD: /usr/sbin/smartctl

Сохраняем и закрываем файл.


Шаг 6: Создание Шаблона в Zabbix

Теперь создадим шаблон для мониторинга SMART в Zabbix.

  1. Переходим в веб-интерфейсе Zabbix: Configuration → Templates → Create template.
  2. Заполняем поля:
    • Template name: Template SMART Monitoring
    • Groups: выбираем подходящую группу, например, Templates.
  3. Нажимаем Add.

Шаг 7: Создание Элементов Данных (Items)

В созданном шаблоне переходим на вкладку Items.

  1. Нажимаем Create item.
  2. Настраиваем первый элемент данных:
    • Name: SMART Health /dev/sda
    • Key: smart.health[sda]
    • Type of information: Numeric (unsigned)
    • Update interval: 1h
  3. Нажимаем Add.

Создаём второй элемент данных для температуры:

  • Name: SMART Temperature /dev/sda
  • Key: smart.temperature[sda]
  • Type of information: Numeric (unsigned)
  • Update interval: 1h

Нажимаем Add.


Шаг 8: Создание Триггеров (Triggers)

Переходим на вкладку Triggers и создаём два триггера:

  1. Первый триггер для контроля состояния диска:
    • Name: SMART Health FAILED on /dev/sda
    • Expression: last(/Template SMART Monitoring/smart.health[sda])=0
  2. Второй триггер для температурного порога:
    • Name: High Temperature on /dev/sda
    • Expression: last(/Template SMART Monitoring/smart.temperature[sda])>50

Шаг 9: Приложение Шаблона к Хосту

Применим созданный шаблон к нужному хосту:

  1. Переходим в Configuration → Hosts.
  2. Выбираем хост и нажимаем Templates.
  3. В поле Link new templates выбираем Template SMART Monitoring.
  4. Нажимаем Update.

Шаг 10: Проверка Работоспособности

Переключаемся в Monitoring → Latest data.

  1. Выбираем нужный хост и убеждаемся, что данные SMART собираются корректно.
  2. Проверяем, что триггеры срабатывают при возникновении проблем с состоянием диска или температуре.

Заключение

Теперь у вас настроена система мониторинга состояния жёстких дисков с использованием SMART в Zabbix. Этот подход поможет вовремя обнаружить потенциальные проблемы и предотвратить потерю данных.

Наткнулся на статью сис.админа Zerox на счёт мониторинга S.M.A.R.T. диска средствами Zabbix. Но что-то у меня никак не получалось по его записи. Поэтому я опишу свой опыт настройки это необходимой вещи.

Будем разворачивать решение с Github. По сути, эта запись просто перевод с небольшими пояснениями. :)

Все необходимые компоненты я сложил в архив, который можно скачать с Я.Диска (если ссылка сломалась пишите к комменты, стучите на почту, смотрите на github).

Содержание

Возможности решения

Данное решает такие задачи:

  1. Мониторинг состояние S.M.A.R.T диска (почти всех показателей);
  2. Мониторинг оставшегося ресурса SSD;
  3. Мониторинг температуры;
  4. Мониторинг производителя, партийного номера, серийного номера (Zabbix вас оповестит, если диск был заменен), что позволяет настроить инвентаризацию;
  5. Мониторинг количество неисправных секторов на диске;

Подготовка Zabbix-Server

Всё, что Вам потребуется, это добавить замечательный шаблон в свой Zabbix.

Подготовка Zabbix-Agent Windows

Установка smartmontools

Ничего необычного, просто устанавливаем smartmontools, как обычную программу. Единственный момент, не рекомендую менять путь, иначе его надо будет менять в конфиге агента и в скрипте.

Конфигурирование агента

Создаем папку scripts и помещаем туда наш скрипт smartctl-disks-discovery.ps1

Открываем zabbix_agentd.conf и правим

#Увеличиваем TimeOut до 30 секунд. Как показывает практика. Если этого будет мало, то потом увеличим.  

TimeOut = 20

И добавляем пользовательскую проверку

UserParameter=uHDD.get[*], for /F «tokens=* usebackq» %a in (`«»%ProgramFiles%\smartmontools\bin\smartctl.exe» -i -H -A -l error -l background $1″`) do @echo %a

UserParameter=uHDD.discovery[*],powershell NoProfile ExecutionPolicy Bypass File «%ProgramFiles%\Zabbix Agent\scripts\smartctl-disks-discovery.ps1»

UserParameter=uSSD.get[*], for /F «tokens=* usebackq» %a in (`«»%ProgramFiles%\smartmontools\bin\smartctl.exe» -i -H -A -l error -l background $1″`) do @echo %a

UserParameter=uSSD.discovery[*],powershell NoProfile ExecutionPolicy Bypass File «%ProgramFiles%\Zabbix Agent\scripts\smartctl-disks-discovery.ps1»

Осталось перезапустить агента и привязать наш хост к шаблону.

Примерно через час прилетят данные. (Для отладки можно поменять время обнаружения, я обычно ставлю 10 минут, меняем 1h на 10m. Главное, не забыть обратно вернуть).

Результат

Таким образом мы настроили мониторинг SSD и HDD дисков. Данное решение отлично показывает себя в проде. По критически важным дискам можно строить вот такие информативные графики. Мне нравится :)

ТраблШутинг

У меня такая проблема возникала, когда забыл ставить smartmontools

Invalid discovery rule value: cannot parse as a valid JSON object: invalid JSON object value starting character at: ????? ???? ?? ??? ?????? ? ?????? NULL.

C:\Program Files\Zabbix Agent\scripts\smartctldisksdiscovery.ps1:34 ????:73

+ $disk_name = $smart_scanresul

Просмотры: 9 069


Если мой материал был полезен, то можете угостить меня кофе ☕️


Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Update pack windows xp 2021
  • Как войти в onedrive windows 10
  • Пространственный звук windows 10 бесплатно
  • Bonzi buddy windows xp
  • Windows 11 перенести панель задач налево