Время на прочтение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
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
orzabbix_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. Especiallyphp_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.
- Переходим в веб-интерфейсе Zabbix: Configuration → Templates → Create template.
- Заполняем поля:
- Template name:
Template SMART Monitoring
- Groups: выбираем подходящую группу, например,
Templates
.
- Template name:
- Нажимаем Add.
Шаг 7: Создание Элементов Данных (Items)
В созданном шаблоне переходим на вкладку Items.
- Нажимаем Create item.
- Настраиваем первый элемент данных:
- Name:
SMART Health /dev/sda
- Key:
smart.health[sda]
- Type of information:
Numeric (unsigned)
- Update interval:
1h
- Name:
- Нажимаем Add.
Создаём второй элемент данных для температуры:
- Name:
SMART Temperature /dev/sda
- Key:
smart.temperature[sda]
- Type of information:
Numeric (unsigned)
- Update interval:
1h
Нажимаем Add.
Шаг 8: Создание Триггеров (Triggers)
Переходим на вкладку Triggers и создаём два триггера:
- Первый триггер для контроля состояния диска:
- Name:
SMART Health FAILED on /dev/sda
- Expression:
last(/Template SMART Monitoring/smart.health[sda])=0
- Name:
- Второй триггер для температурного порога:
- Name:
High Temperature on /dev/sda
- Expression:
last(/Template SMART Monitoring/smart.temperature[sda])>50
- Name:
Шаг 9: Приложение Шаблона к Хосту
Применим созданный шаблон к нужному хосту:
- Переходим в Configuration → Hosts.
- Выбираем хост и нажимаем Templates.
- В поле Link new templates выбираем
Template SMART Monitoring
. - Нажимаем Update.
Шаг 10: Проверка Работоспособности
Переключаемся в Monitoring → Latest data.
- Выбираем нужный хост и убеждаемся, что данные SMART собираются корректно.
- Проверяем, что триггеры срабатывают при возникновении проблем с состоянием диска или температуре.
Заключение
Теперь у вас настроена система мониторинга состояния жёстких дисков с использованием SMART в Zabbix. Этот подход поможет вовремя обнаружить потенциальные проблемы и предотвратить потерю данных.
Наткнулся на статью сис.админа Zerox на счёт мониторинга S.M.A.R.T. диска средствами Zabbix. Но что-то у меня никак не получалось по его записи. Поэтому я опишу свой опыт настройки это необходимой вещи.
Будем разворачивать решение с Github. По сути, эта запись просто перевод с небольшими пояснениями.
Все необходимые компоненты я сложил в архив, который можно скачать с Я.Диска (если ссылка сломалась пишите к комменты, стучите на почту, смотрите на github).
Содержание
Возможности решения
Данное решает такие задачи:
- Мониторинг состояние S.M.A.R.T диска (почти всех показателей);
- Мониторинг оставшегося ресурса SSD;
- Мониторинг температуры;
- Мониторинг производителя, партийного номера, серийного номера (Zabbix вас оповестит, если диск был заменен), что позволяет настроить инвентаризацию;
- Мониторинг количество неисправных секторов на диске;
Подготовка 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\smartctl—disks—discovery.ps1:34 ????:73 + $disk_name = $smart_scanresul |
Просмотры: 9 069
Если мой материал был полезен, то можете угостить меня кофе ☕️