Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Мониторинг Железа
Датчики температур
Кулера
Диски
Напряжение
и т.д.
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Артём Мамзиков »

Предыдущая версия тут Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD через smartmontools
еще один вариант для ssh Скрипт + Шаблон LLD-SSH Для проверки Жестких Дисков по SMART HDD SSD через smartmontools



Чем меня не устроил предыдущий вариант, тем что он создает все элементы которые есть в узле, даже если таких кодов проверки нет на диске и висят они все в "Не поддерживается" более 50% можно конечно это все деактивировать выбрать фильтром для отображения но это не то.

Пример как это выглядит на узле с 2-мя дисками hdd
Пример Предыдущей версии проверки smart hdd
Пример Предыдущей версии проверки smart hdd
И так что можно сделать?
1. Создать один прототип и на основе его создавать элемент данных по доступности рабочих ID кодов smart диска.
Минус теряем все описание и триггеры, для всех найденных элементов в узле придется все делать руками. Аналогично при новых дисках.

2. Передать данные из скрипта макросами название элемента, описание, условие триггеров т.е. задать каждому коду свое соответствие.
Минус каждый элемент будет как бы создан вручную в плане инфы в БД, если у нас в шаблоне используется 1 описание для всех узлов этого элемента тут же в каждом узле описание свое хотя одно и то же. Можно даже сделать несколько языков из скрипта)))

3. Не создавать же Отдельное обнаружение правила для каждого кода

4. Разные прототипы в одном обнаружении Вот тут уже интереснее, но не все так просто.

5. В новой версии заббикс диск уже мониторится из коробки у меня на данный момент 4.2

Делаем по 4 варианту.
Первые попытки
Вывод из скрипта
Показать
[
{"{#DISKID}":"sda", "{#IDNUM1}":"1"},
{"{#DISKID}":"sda", "{#IDNUM3}":"3"},
{"{#DISKID}":"sda", "{#IDNUM4}":"4"},
{"{#DISKID}":"sda", "{#IDNUM5}":"5"},
{"{#DISKID}":"sda", "{#IDNUM7}":"7"},
{"{#DISKID}":"sda", "{#IDNUM9}":"9"},
{"{#DISKID}":"sda", "{#IDNUM10}":"10"},
{"{#DISKNAME}":"sda"},
{"{#DISKID}":"sdb", "{#IDNUM1}":"1"},
{"{#DISKID}":"sdb", "{#IDNUM3}":"3"},
{"{#DISKID}":"sdb", "{#IDNUM4}":"4"},
{"{#DISKID}":"sdb", "{#IDNUM5}":"5"},
{"{#DISKID}":"sdb", "{#IDNUM7}":"7"},
{"{#DISKID}":"sdb", "{#IDNUM8}":"8"},
{"{#DISKID}":"sdb", "{#IDNUM9}":"9"},
{"{#DISKID}":"sdb", "{#IDNUM10}":"10"},
{"{#DISKNAME}":"sdb"}
]
Тянем диск #DISKID и код #IDNUM10
И ничего не выходит)

Шаблон
smart hdd lld
smart hdd lld
Элементы данных
Пример
Пример
Правило обнаружения
Получаю
Получаю
Что тут получилось , то что #DISKID является универсальным и указан для всех элементов, а имена дисков прилетели и все элементы опять создались в узле.
Если убрать из прототипов #DISKID и оставить только #IDNUM10 еще удалить зависимый элемент тогда создается то что нам нужно но при условии что зависимый элемент данных один, если их 2 создается только для 1го. Причем зависимый элементы данных обычный не прототип.
Были еще варианты создается прототип с диском но пустым кодом или с кодом но без диска.

По итогу нужны прототипы с одним зависимым обычным элементом данных (ибо не будем же для каждого когда делать внешний запрос) универсальный макрос для прототипов чисто #IDNUM указать нельзя все элементы опять выйдут, разные так же нельзя так как это не универсальный будет. Сработало с цифрами ставим в конце цифры и если они совпадают элемент создается.
#IDNUM20tt -так нельзя работать не будет #IDNUMцифры - так будет.


Про сам шаблон что получилось:
1. Добавлен порт по умолчанию 10050
2. Добавлено прототипов их теперь не 77 а прям 274 с запасом)
3. Элементы создаются те которые Поддерживаются диском
4. Регулярки прилетают макросом так как для одного кода может быть по 8 разных обозначений (имя ограничено 21 символом сокращения)
раньше код мог быть но элемент не поддерживался так как не совпадала регулярка!
JSONPath - на 4.2 не работает по этому только регулярка.
Например для 167
Показать
167 SSD Protect Mode Режим защиты SSD-накопителя
SSD Write Protect Mode Режим защиты от записи на твердотельный накопитель
Max Bad Blocks per Die Максимальное количество плохих блоков на кубик
Average Erase Count Среднее количество Стираний
Min Bad Block Die Минимальный Плохой Блок Умирает
Более подробно можно посмотреть в исходника
и
S.M.A.R.T. - Википедия EN - Больше инфы
S.M.A.R.T. - Википедия русская версия
smartmontools/www/examples/ Примеры для разных дисков

5. Разделено HDD и SSD 2 правило обнаружения.
Определение происходит по строке Rotation Rate: Solid State Device если данная строка присутствует это SSD, если нет это HDD.
Данная строка может вовсе отсутствовать если командная строка открыта от обычного пользователя. Для полного вывода инфы запускать от имени Администратора!
Разница вывода Администратора и Пользователя
Разница вывода Администратора и Пользователя
Если строка не найдена то диск будет как HDD т.е. не будет такого что диск вовсе не создастся.
Обязательно должна быть строка SMART support is: Enabled иначе смарта нет мониторить нечего ничего создано не будет!

6. Уменьшен лог с информацией оставлена только не обходимая.

СКАЧАТЬ
Проверка HDD SSD Дисков по SMART LLD.zip
Проверка HDD SSD Дисков по SMART
(82.11 КБ) 177 скачиваний
Скачать
11.01.2022-Проверка HDD SSD Дисков по SMART LLD.zip
11.01.2022-Проверка HDD SSD Дисков по SMART LLD.zip
(82.15 КБ) 342 скачивания
Изменения
Показать
11.01.2022
В некоторых случаях в 190 и 194 коде нет в конце скобок, сделана обычная регулярка
для 194 кода добавлен триггер
sda:194 Temperature_Celsius -O---- 176 176 000 - 34 (Min/Max 17/47)
sdd:194 Temperature_Celsius -O---K 114 098 000 - 29
Вывод со скрипта
Показать
./smartctl-lld.sh 192.168.175.8 10050 discoveryhdd
[
{"{#IDNUM1}":"sdb:1", "{#ATRIB}":"sdb:1 Raw_Read_Error_Rate"},
{"{#IDNUM3}":"sdb:3", "{#ATRIB}":"sdb:3 Spin_Up_Time"},
{"{#IDNUM4}":"sdb:4", "{#ATRIB}":"sdb:4 Start_Stop_Count"},
{"{#IDNUM5}":"sdb:5", "{#ATRIB}":"sdb:5 Reallocated_Sector_Ct"},
{"{#IDNUM7}":"sdb:7", "{#ATRIB}":"sdb:7 Seek_Error_Rate"},
{"{#IDNUM9}":"sdb:9", "{#ATRIB}":"sdb:9 Power_On_Hours"},
{"{#IDNUM10}":"sdb:10", "{#ATRIB}":"sdb:10 Spin_Retry_Count"},
{"{#IDNUM12}":"sdb:12", "{#ATRIB}":"sdb:12 Power_Cycle_Count"},
{"{#IDNUM18}":"sdb:18", "{#ATRIB}":"sdb:18 Unknown_Attribute"},
{"{#IDNUM187}":"sdb:187", "{#ATRIB}":"sdb:187 Reported_Uncorrect"},
{"{#IDNUM188}":"sdb:188", "{#ATRIB}":"sdb:188 Command_Timeout"},
{"{#IDNUM190}":"sdb:190", "{#ATRIB}":"sdb:190 Airflow_Temperature_Cel"},
{"{#IDNUM192}":"sdb:192", "{#ATRIB}":"sdb:192 Power-Off_Retract_Count"},
{"{#IDNUM193}":"sdb:193", "{#ATRIB}":"sdb:193 Load_Cycle_Count"},
{"{#IDNUM194}":"sdb:194", "{#ATRIB}":"sdb:194 Temperature_Celsius"},
{"{#IDNUM195}":"sdb:195", "{#ATRIB}":"sdb:195 Hardware_ECC_Recovered"},
{"{#IDNUM197}":"sdb:197", "{#ATRIB}":"sdb:197 Current_Pending_Sector"},
{"{#IDNUM198}":"sdb:198", "{#ATRIB}":"sdb:198 Offline_Uncorrectable"},
{"{#IDNUM199}":"sdb:199", "{#ATRIB}":"sdb:199 UDMA_CRC_Error_Count"},
{"{#IDNUM240}":"sdb:240", "{#ATRIB}":"sdb:240 Head_Flying_Hours"},
{"{#IDNUM241}":"sdb:241", "{#ATRIB}":"sdb:241 Total_LBAs_Written"},
{"{#IDNUM242}":"sdb:242", "{#ATRIB}":"sdb:242 Total_LBAs_Read"},
{"{#IDNUM9001}":"sdb:Device Model:"},
{"{#IDNUM9002}":"sdb:Serial Number:"},
{"{#IDNUM9003}":"sdb:LU WWN Device Id:"},
{"{#IDNUM9004}":"sdb:Firmware Version:"},
{"{#IDNUM9005}":"sdb:User Capacity:"},
{"{#IDNUM9007}":"sdb:Rotation Rate:"},
{"{#IDNUM9008}":"sdb:ATA Version is:"},
{"{#IDNUM9009}":"sdb:SATA Version is:"},
{"{#IDNUM9010}":"sdb:SMART overall-health self-assessment test result:"}
]

./smartctl-lld.sh 192.168.175.8 10050 discoveryssd
[
{"{#IDNUM1}":"sda:1", "{#ATRIB}":"sda:1 Raw_Read_Error_Rate"},
{"{#IDNUM9}":"sda:9", "{#ATRIB}":"sda:9 Power_On_Hours"},
{"{#IDNUM12}":"sda:12", "{#ATRIB}":"sda:12 Power_Cycle_Count"},
{"{#IDNUM168}":"sda:168", "{#ATRIB}":"sda:168 SATA_Phy_Error_Count"},
{"{#IDNUM170}":"sda:170", "{#ATRIB}":"sda:170 Bad_Blk_Ct_Erl"},
{"{#IDNUM173}":"sda:173", "{#ATRIB}":"sda:173 MaxAvgErase_Ct"},
{"{#IDNUM192}":"sda:192", "{#ATRIB}":"sda:192 Unsafe_Shutdown_Count"},
{"{#IDNUM194}":"sda:194", "{#ATRIB}":"sda:194 Temperature_Celsius"},
{"{#IDNUM218}":"sda:218", "{#ATRIB}":"sda:218 CRC_Error_Count"},
{"{#IDNUM231}":"sda:231", "{#ATRIB}":"sda:231 SSD_Life_Left"},
{"{#IDNUM241}":"sda:241", "{#ATRIB}":"sda:241 Lifetime_Writes_GiB"},
{"{#IDNUM9000}":"sda:Model Family:"},
{"{#IDNUM9001}":"sda:Device Model:"},
{"{#IDNUM9002}":"sda:Serial Number:"},
{"{#IDNUM9004}":"sda:Firmware Version:"},
{"{#IDNUM9005}":"sda:User Capacity:"},
{"{#IDNUM9006}":"sda:Sector Size:"},
{"{#IDNUM9007}":"sda:Rotation Rate:"},
{"{#IDNUM9008}":"sda:ATA Version is:"},
{"{#IDNUM9009}":"sda:SATA Version is:"},
{"{#IDNUM9010}":"sda:SMART overall-health self-assessment test result:"}
]

./smartctl-lld.sh 192.168.175.8 10050 info
sda:SMART Attributes Data Structure revision number: 16
sda:Vendor Specific SMART Attributes with Thresholds:
sda:ID# ATTRIBUTE_NAME FLAGS VALUE WORST THRESH FAIL RAW_VALUE
sda:1 Raw_Read_Error_Rate PO-R-- 100 100 050 - 0
sda:9 Power_On_Hours -O--C- 100 100 000 - 3412
sda:12 Power_Cycle_Count -O--C- 100 100 000 - 1079
sda:168 SATA_Phy_Error_Count -O--C- 100 100 000 - 0
sda:170 Bad_Blk_Ct_Erl/Lat PO---- 100 100 010 - 0/319
sda:173 MaxAvgErase_Ct -O--C- 100 100 000 - 44 (Average 23)
sda:192 Unsafe_Shutdown_Count -O--C- 100 100 000 - 66
sda:194 Temperature_Celsius PO---K 067 067 000 - 33 (Min/Max 33/33)
sda:218 CRC_Error_Count PO-R-- 100 100 050 - 0
sda:231 SSD_Life_Left PO--C- 100 100 000 - 99
sda:241 Lifetime_Writes_GiB -O--C- 100 100 000 - 7735
sda:||||||_ K auto-keep
sda:|||||__ C event count
sda:||||___ R error rate
sda:|||____ S speed/performance
sda:||_____ O updated online
sda:|______ P prefailure warning
sda:
sda:General Purpose Log Directory Version 1
sda:=== START OF INFORMATION SECTION ===
sda:Model Family: Phison Driven SSDs
sda:Device Model: Patriot Burst
sda:Serial Number: 3F5F0798136800775641
sda:Firmware Version: SBFM61.3
sda:User Capacity: 480▒103▒981▒056 bytes [480 GB]
sda:Sector Size: 512 bytes logical/physical
sda:Rotation Rate: Solid State Device
sda:Form Factor: 2.5 inches
sda:TRIM Command: Available
sda:Device is: In smartctl database [for details use: -P show]
sda:ATA Version is: ACS-4 (minor revision not indicated)
sda:SATA Version is: SATA 3.2, 6.0 Gb/s (current: 3.0 Gb/s)
sda:Local Time is: Sun Dec 26 18:23:39 2021 RTZ
sda:SMART overall-health self-assessment test result: PASSED
sdb:SMART Attributes Data Structure revision number: 10
sdb:Vendor Specific SMART Attributes with Thresholds:
sdb:ID# ATTRIBUTE_NAME FLAGS VALUE WORST THRESH FAIL RAW_VALUE
sdb:1 Raw_Read_Error_Rate POSR-- 082 067 044 - 159875857
sdb:3 Spin_Up_Time PO---- 096 096 000 - 0
sdb:4 Start_Stop_Count -O--CK 100 100 020 - 311
sdb:5 Reallocated_Sector_Ct PO--CK 100 100 010 - 0
sdb:7 Seek_Error_Rate POSR-- 064 060 045 - 2408711
sdb:9 Power_On_Hours -O--CK 100 100 000 - 862
sdb:10 Spin_Retry_Count PO--C- 100 100 097 - 0
sdb:12 Power_Cycle_Count -O--CK 100 100 020 - 311
sdb:18 Unknown_Attribute PO-R-- 100 100 050 - 0
sdb:187 Reported_Uncorrect -O--CK 100 100 000 - 0
sdb:188 Command_Timeout -O--CK 100 100 000 - 0
sdb:190 Airflow_Temperature_Cel -O---K 078 065 040 - 22 (Min/Max 14/22)
sdb:192 Power-Off_Retract_Count -O--CK 100 100 000 - 5
sdb:193 Load_Cycle_Count -O--CK 098 098 000 - 4219
sdb:194 Temperature_Celsius -O---K 022 040 000 - 22 (0 11 0 0 0)
sdb:195 Hardware_ECC_Recovered -O-RC- 004 002 000 - 159875857
sdb:197 Current_Pending_Sector -O--C- 100 100 000 - 0
sdb:198 Offline_Uncorrectable ----C- 100 100 000 - 0
sdb:199 UDMA_CRC_Error_Count -OSRCK 200 200 000 - 0
sdb:240 Head_Flying_Hours ------ 100 253 000 - 256 (156 89 0)
sdb:241 Total_LBAs_Written ------ 100 253 000 - 649963134
sdb:242 Total_LBAs_Read ------ 100 253 000 - 243977623
sdb:||||||_ K auto-keep
sdb:|||||__ C event count
sdb:||||___ R error rate
sdb:|||____ S speed/performance
sdb:||_____ O updated online
sdb:|______ P prefailure warning
sdb:
sdb:General Purpose Log Directory Version 1
sdb:=== START OF INFORMATION SECTION ===
sdb:Device Model: ST2000NM001A-2J2101
sdb:Serial Number: WJC00QHY
sdb:LU WWN Device Id: 5 000c50 0cbf4c847
sdb:Firmware Version: SN02
sdb:User Capacity: 2▒000▒398▒934▒016 bytes [2,00 TB]
sdb:Sector Sizes: 512 bytes logical, 4096 bytes physical
sdb:Rotation Rate: 7200 rpm
sdb:Form Factor: 3.5 inches
sdb:Device is: Not in smartctl database [for details use: -P showall]
sdb:ATA Version is: ACS-4 (minor revision not indicated)
sdb:SATA Version is: SATA 3.3, 6.0 Gb/s (current: 3.0 Gb/s)
sdb:Local Time is: Sun Dec 26 18:23:40 2021 RTZ
sdb:SMART overall-health self-assessment test result: PASSED
Скрипт smartctl-lld.sh

Код: Выделить всё

#!/bin/bash
# 2021.12.17 Артём Андреевич Мамзиков
# URL https://diyit.ru/viewtopic.php?t=1944
# Скрипт мониторинга HDD с LLD для Zabbix (серверный вариант)

# Авто обнаружение дисков

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
#DISKNAME=$4

# Получение инфы (по ключевым словам)
searchp="Model Family:|Device Model:|Serial Number:|LU WWN Device Id:|Firmware Version:|User Capacity:|Sector Size:|Rotation Rate:|ATA Version is:|SATA Version is:|SMART overall-health self-assessment test result:"

IFS=$'\n'
# (IFS оболочка считает, что пробел является границей слов делает пробелы между слов $* - отбрасывает символы и границы слов \n – это escape-последовательность для новой строки (переводится в новую строку)

if [[ $BLOCSCRIPT = "discoveryhdd" ]]
then
# Запускаем команду smartctl --scan-open |и ищем строки содержащие /dev/sd и передаем всё в переменную get
get=`zabbix_get -s $IP -p $PORT -k system.run["smartctl --scan-open"] | grep "/dev/sd"`
# Запускаем Цикл из переменной get
for hdd in $get
do
# получаем переменную DISK = Данные переменной get| ищем строки содержащие /dev/sd | вывести значение после /dev/ | оставляем первые 3 значение остальное убираем
DISKID=`echo $hdd | grep "/dev/sd" | sed "s/\/dev\///" | cut -c 1-3`
	# После того как мы получили переменные для DISKID подставляем их (пример sda sdb)
	# Проверяем что включен smart на данном диске и диск ssd ищем строки SMART support is: Enabled и Rotation Rate: Solid State Device если строки найдены, на выходе получим их ответ не пустой условие не выполняется != "" , продолжим выполнение скрипта. 
	# Если хотя бы 1 строка не найдена ответ будет пустым, условие != "" выполняется скрипт будет завершен.
	# В условии запрашиваем данные диска smartctl -i /dev/***|выбираем 2 строки| удаляем перенос строки делаем 1 строкой| удаляем весь вывод если есть строка Solid State Device и завершение скрипта, если строки нет выполняем дальше| проверка что смарт включен, если строка найдена продолжаем.
	if [[ `zabbix_get -s $IP -p $PORT -k system.run["smartctl -i /dev/$DISKID"]|grep -E "SMART support is:|Rotation Rate:"|tr -d "\r\n"|sed '/.*Rotation Rate:.*Solid State Device.*/d' | grep "SMART support is: Enabled"` != "" ]]
	then
	# Подстановка имен диска sda sdb и  т.д.
	#DISKN=$DISKN"$SEP\n{\"{#IDNUM0}\":\"$DISKID\"}"
	#SEP=", "
		 # Запросим поддерживаемые атрибуты диском, для создания элементов |удалить пробелы вначале |строки содержащие в начале цифры первый столбец и второй с помощью регулярки для сохранения количества пробелов
		IDATR=`zabbix_get -s $IP -p $PORT -k system.run["smartctl -A /dev/"${DISKID}""]|sed -r 's/^ *//g'|grep -Eo "(^[0-9]+\s+[A-Za-z_-]+)"`
		for ATRIB in $IDATR
		do
		# Код ID Диска | только числовое значение
		IDNUM=$(echo $ATRIB|awk '{print $1}'|egrep -o '[0-9]+')
		# Атрибут кода диска и id $ATRIB
		# Собираем вывод
		DISKN=$DISKN"$SEP\n{\"{#IDNUM$IDNUM}\":\"$DISKID:$IDNUM\", \"{#ATRIB}\":\"$DISKID:$ATRIB\"}"
		SEP=", "
		done

		# Информация о диске выбор строк |Поиск строк| вывод до двоеточия
		infodiskx=$(zabbix_get -s $IP -p $PORT -k system.run["smartctl -x /dev/"${DISKID}""]|grep -aE "$searchp"|grep -o '^[^:]*:')
		for infodisk in $infodiskx
		do
		# Чтоб не создавать 2 правило обнаружения, сделаем зависимость на 1 элемент и приведем макрос к единому виду {#IDNUM***}
		ACCORDANCE="" # сброс переменной в цикле
		# верхний регистр для макроса lld
		infodiskz=$(echo $infodisk|tr [:lower:] [:upper:])
		case $infodiskz in
			*"MODEL FAMILY:"*)
			ACCORDANCE="9000"
			;;
			*"DEVICE MODEL:"*)
			ACCORDANCE="9001"
			;;
			*"SERIAL NUMBER:"*)
			ACCORDANCE="9002"
			;;
			*"LU WWN DEVICE ID:"*)
			ACCORDANCE="9003"
			;;
			*"FIRMWARE VERSION:"*)
			ACCORDANCE="9004"
			;;
			*"USER CAPACITY:"*)
			ACCORDANCE="9005"
			;;
			*"SECTOR SIZE:"*)
			ACCORDANCE="9006"
			;;
			*"ROTATION RATE:"*)
			ACCORDANCE="9007"
			;;
			"ATA VERSION IS:"*)
			ACCORDANCE="9008"
			;;
			*"SATA VERSION IS:"*)
			ACCORDANCE="9009"
			;;
			*"SMART OVERALL-HEALTH SELF-ASSESSMENT TEST RESULT:"*)
			ACCORDANCE="9010"
			;;
			# *":"*)
			# ACCORDANCE="9011"
			# ;;
		esac

		DISKN=$DISKN"$SEP\n{\"{#IDNUM$ACCORDANCE}\":\"$DISKID:$infodisk\"}"
		SEP=", "
		done

	# Список имен диска в конце вывода
	# DISKNAME=$DISKNAME"$SEP\n{\"{#DISKNAME}\":\"$DISKID\"}"

	JSON="${DISKN}"
        fi
done

# Список имен диска в конце вывода
#JSON="${DISKN}""${DISKNAME}"

# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"
fi


if [[ $BLOCSCRIPT = "discoveryssd" ]]
then
# Запускаем команду smartctl --scan-open |и ищем строки содержащие /dev/sd и передаем всё в переменную get
get=`zabbix_get -s $IP -p $PORT -k system.run["smartctl --scan-open"] | grep "/dev/sd"`
# Запускаем Цикл из переменной get
for hdd in $get
do
# получаем переменную DISK = Данные переменной get| ищем строки содержащие /dev/sd | вывести значение после /dev/ | оставляем первые 3 значение остальное убираем
DISKID=`echo $hdd | grep "/dev/sd" | sed "s/\/dev\///" | cut -c 1-3`
	# После того как мы получили переменные для DISKID подставляем их (пример sda sdb)
	# Проверяем что включен smart на данном диске и диск ssd ищем строки SMART support is: Enabled и Rotation Rate: Solid State Device если строки найдены, на выходе получим их ответ не пустой условие не выполняется != "" , продолжим выполнение скрипта. 
	# Если хотя бы 1 строка не найдена ответ будет пустым, условие != "" выполняется скрипт будет завершен.
	# В условии запрашиваем данные диска smartctl -i /dev/***|выбираем 2 строки| удаляем перенос строки делаем 1 строкой| через условие И смотрим что обе строки есть
	if [[ `zabbix_get -s $IP -p $PORT -k system.run["smartctl -i /dev/$DISKID"] |grep -E "SMART support is:|Rotation Rate:"|tr -d "\r\n"| grep -E "SMART support is:\s+Enabled" |grep -E "Rotation Rate:\s+Solid State Device"` != "" ]]
	then
	# Подстановка имен диска sda sdb и  т.д.
	#DISKN=$DISKN"$SEP\n{\"{#IDNUM0}\":\"$DISKID\"}"
	#SEP=", "
		 # Запросим поддерживаемые атрибуты диском, для создания элементов |удалить пробелы вначале |строки содержащие в начале цифры первый столбец и второй с помощью регулярки для сохранения количества пробелов
		IDATR=`zabbix_get -s $IP -p $PORT -k system.run["smartctl -A /dev/"${DISKID}""]|sed -r 's/^ *//g'|grep -Eo "(^[0-9]+\s+[A-Za-z_-]+)"`
		for ATRIB in $IDATR
		do
		# Код ID Диска | только числовое значение
		IDNUM=$(echo $ATRIB|awk '{print $1}'|egrep -o '[0-9]+')
		# Атрибут кода диска и id $ATRIB
		# Собираем вывод
		DISKN=$DISKN"$SEP\n{\"{#IDNUM$IDNUM}\":\"$DISKID:$IDNUM\", \"{#ATRIB}\":\"$DISKID:$ATRIB\"}"
		SEP=", "
		done

		# Информация о диске выбор строк |Поиск строк| вывод до двоеточия
		infodiskx=$(zabbix_get -s $IP -p $PORT -k system.run["smartctl -x /dev/"${DISKID}""]|grep -aE "$searchp"|grep -o '^[^:]*:')
		for infodisk in $infodiskx
		do
		# Чтоб не создавать 2 правило обнаружения, сделаем зависимость на 1 элемент и приведем макрос к единому виду {#IDNUM***}
		ACCORDANCE="" # сброс переменной в цикле
		# верхний регистр для макроса lld
		infodiskz=$(echo $infodisk|tr [:lower:] [:upper:])
		case $infodiskz in
			*"MODEL FAMILY:"*)
			ACCORDANCE="9000"
			;;
			*"DEVICE MODEL:"*)
			ACCORDANCE="9001"
			;;
			*"SERIAL NUMBER:"*)
			ACCORDANCE="9002"
			;;
			*"LU WWN DEVICE ID:"*)
			ACCORDANCE="9003"
			;;
			*"FIRMWARE VERSION:"*)
			ACCORDANCE="9004"
			;;
			*"USER CAPACITY:"*)
			ACCORDANCE="9005"
			;;
			*"SECTOR SIZE:"*)
			ACCORDANCE="9006"
			;;
			*"ROTATION RATE:"*)
			ACCORDANCE="9007"
			;;
			"ATA VERSION IS:"*)
			ACCORDANCE="9008"
			;;
			*"SATA VERSION IS:"*)
			ACCORDANCE="9009"
			;;
			*"SMART OVERALL-HEALTH SELF-ASSESSMENT TEST RESULT:"*)
			ACCORDANCE="9010"
			;;
			# *":"*)
			# ACCORDANCE="9011"
			# ;;
		esac

		DISKN=$DISKN"$SEP\n{\"{#IDNUM$ACCORDANCE}\":\"$DISKID:$infodisk\"}"
		SEP=", "
		done

	# Список имен диска в конце вывода
	# DISKNAME=$DISKNAME"$SEP\n{\"{#DISKNAME}\":\"$DISKID\"}"

	JSON="${DISKN}"
        fi
done

# Список имен диска в конце вывода
#JSON="${DISKN}""${DISKNAME}"

# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"
fi


# Получение информации о дисках
if [[ $BLOCSCRIPT = "info" ]]
then
# Запускаем команду smartctl --scan-open |и ищем строки содержащие /dev/sd и передаем всё в переменную get
get=`zabbix_get -s $IP -p $PORT -k system.run["smartctl --scan-open"] | grep "/dev/sd"`
# Запускаем Цикл из переменной get
for hdd in $get
do
# получаем переменную DISK = Данные переменной get| ищем строки содержащие /dev/sd | вывести значение после /dev/ | оставляем первые 3 значение остальное убираем
DISKID=`echo $hdd | grep "/dev/sd" | sed "s/\/dev\///" | cut -c 1-3`
	# После того как мы получили переменные для DISKID подставляем их (пример sda sdb)
	# Проверяем что включен smart на данном диске ищем строку SMART support is: Enabled если ее нет ничего не выводим, при поиске по шаблону
	#внутри [!=] сравнение строк SMART support is: Enabled = SMART support is: Enabled выполняется передаем дальше.
	if [[ `zabbix_get -s $IP -p $PORT -k system.run["smartctl -i /dev/$DISKID"] | grep "SMART support is: Enabled"` != "" ]]
	then
        atrbp=`zabbix_get -s $IP -p $PORT -k system.run["smartctl -x /dev/$DISKID"]`

		# Выбор блока для смарт атрибутов| удаление пробелов вначале |в начале каждой строки добавим имя диска (для регулярки предобработки разных дисков)
		attr=$(echo "${atrbp}"|sed -n '/SMART Attributes/,/General Purpose/p'|sed -r 's/^ *//g'|sed -e "s/^/$DISKID:/")

		# Выбор блока информации
		info=$(echo "${atrbp}"|sed -n '/START OF INFORMATION SECTION/,/Local Time is/p'|sed -r 's/^ *//g'|sed -e "s/^/$DISKID:/")

		# Строка состояние смарта
		statussmart=$(echo "${atrbp}"|grep -aE "SMART overall-health self-assessment test result:"|sed -r 's/^ *//g'|sed -e "s/^/$DISKID:/")
	# Суммируем данные для каждого диска
	SMART=$SMART"\n"${attr}"\n"${info}"\n"${statussmart}""
	fi
done
echo -e "${SMART}"|grep -aEv "^$"
fi
Шаблон
Шаблон Проверка HDD SSD Дисков по SMART
Шаблон Проверка HDD SSD Дисков по SMART
Элемент данных
Диск Поддерживаемые Атрибуты SMART информация SMARTCTL текст
Диск Поддерживаемые Атрибуты SMART информация SMARTCTL текст
Правила обнаружения
Правила обнаружения Обнаружение smart кодов проверки дисков
Правила обнаружения Обнаружение smart кодов проверки дисков
Прототипы и триггеры в обоих правилах одинаковы, в дальнейшем можно изменить описания переделать добавить триггеры!
Прототипы элементов smart кодов проверки дисков
Прототипы элементов smart кодов проверки дисков
Прототипы Триггеров smart кодов проверки дисков
Прототипы Триггеров smart кодов проверки дисков
Пример одного из прототипа элементов данных
Прототип элемента данных Диск SMART - абсолютное значение ошибок считывания {#ATRIB}
Прототип элемента данных Диск SMART - абсолютное значение ошибок считывания {#ATRIB}
Во всех прототипах с 1 по 263
Регулярка
{#ATRIB}\s+[A-z-]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-z-_]+\s+([0-9]+) вывод в \1

Кроме температуры 190 и 194
тут регулярка
{#ATRIB}\s+[A-z-]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-z-_]+\s+([0-9]+)\s+\(.*[0-9/]+\)

На некоторых дисках нет (Min/Max 19/46) возможно даже лучше регулярку оставить обычную без \s+\(.*[0-9/]+\)

И элементы Инфо о диске которые идут с кодом 9000 - 9010
тут регулярка {#IDNUM9000} (.*) \1 вывести после двоеточия инфу

Еще один момент у вас все будет работать обнаруживается, но в правиле будет всегда ошибка:
Cannot create item: item with the same key "smartctl.Sector-Size.["{#IDNUM****}"]" already exists
Так как заббикс не совсем понимает такую схему обнаружения.
Диск SMART Ошибка при обнаружении
Диск SMART Ошибка при обнаружении
Скрипт для автоматической установки smartmontools на Windows
Install smartmontools.bat

Код: Выделить всё

@ECHO OFF
mode con:cols=130 lines=40
color 1A
:: Автор Артём Андреевич Мамзиков
chcp 866 >NUL
TITLE Установка smartmontools
@cls
echo.
echo.     Данный скрипт автоматически выполнит:
echo.      Установку smartmontools состояния дисков
echo.      Скрипт должен выполнятся от имени Администратора
echo.      или Пользователя имеющего соответствующие права на изменения!!!
@echo off
pause
@Echo Off

chcp 866 >NUL
::Установка smartmontools состояния дисков
start "%~dp0"smartmontools-7.0-1.win32-setup.exe /S
::Для Windows XP Служба zabbix agentd запущенная от имени Локальная система не видит smartctl.exe
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%path%;C:\Program Files"\smartmontools\bin; /f
:: Проверка наличия переменной, если нет добавляем 
echo %PATH%|>nul find /i "C:\Program Files\smartmontools\bin"||path %PATH%;C:\Program Files\smartmontools\bin\;
::Дополнительно команды для переменных если выше команд не достаточно
::reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\smartctl.exe" /ve /t REG_SZ /d "C:\Program Files\smartmontools\bin\smartctl.exe" /f
::reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\smartctl.exe" /v Path /t REG_SZ /d "C:\Program Files"\smartmontools\bin\ /f
::reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\smartctl-nc.exe" /ve /t REG_SZ /d "C:\Program Files\smartmontools\bin\smartctl-nc.exe" /f
::reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\smartctl-nc.exe" /v Path /t REG_SZ /d "C:\Program Files"\smartmontools\bin\ /f
::reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\smartd.exe" /ve /t REG_SZ /d "C:\Program Files\smartmontools\bin\smartd.exe" /f
::reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\smartd.exe" /v Path /t REG_SZ /d "C:\Program Files"\smartmontools\bin\ /f
color 0f
Скачать
Install smartmontools.zip
Install smartmontools.zip
(935 байт) 118 скачиваний
Рядом со скриптом должен быть smartmontools-7.0-1.win32-setup.exe
количество слов: 2575
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Артём Мамзиков »

Процесс создания.

Выбор параметров.
zabbix_get -s 192.168.xxx.xx -p 10050 -k system.run["smartctl -x /dev/sda"]|grep -aE "Model Family:|Device Model:|Serial Number:|LU WWN Device Id:|Firmware Version:|User Capacity:|Sector Size:|Rotation Rate:|ATA Version is:|SATA Version is:|SMART overall-health self-assessment test result:"

После двоеточия
|sed 's/:.*/:/'
|grep -o '.*:'
|egrep -o '^[^:]*:'
tr [:lower:] [:upper:] - верхний регистр
|sed 's/\s/-/g' - пробелы на тире -

Регулярки

\s+ регулярка пробелы любое количество
A-z- любые en буквы и тире
[0-9]+ блок цифр
.* любые символы

Пред обработка регуляркой
sda:1 Raw_Read_Error_Rate.* ([0-9]+)$
Вывод \1

Более универсальная регулярка если таблица отличается от версий
{#ATRIB}\s+.*\s+([0-9]+)[\r\n]
Вид немного другой таблицы смарт
Показать
sda:ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
sda:1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0
sda:3 Spin_Up_Time 0x0027 131 130 021 Pre-fail Always - 4441
sda:4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 69
sda:5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
sda:7 Seek_Error_Rate 0x002e 200 200 000 Old_age Always - 0
sda:9 Power_On_Hours 0x0032 038 038 000 Old_age Always - 45965
проверяю конкретную строку все ок ,
если строк несколько не работает c $ искомая строка должна быть в самом низу тогда опять работает
пробовал так [\r\n] опять подходит не во всех случаях есть LF и CRLF
указать регулярку чтоб он брал именно последнее значение в строке.

.* ([0-9]+)$ - работает только если искомая строка 1 или последняя завершающая в остальных случаях нет, без $ работает но нет гарантии что это будет последнее значение строки.
Поэтому расписываем полностью

.*\s+([A-z-]+)\s+([0-9]+)\s+ ([0-9]+)\s+ ([0-9]+)\s+([A-z-_]+)\s+([0-9]+) вывод в \6
sda:1s\+Raw_Read_Error_Rate.*\s+[A-z-]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-z-_]+\s+([0-9]+) вывод в \1

Делаем так
{#IDNUM1}\s+Raw_Read_Error_Rate.*\s+[A-z-]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-z-_]+\s+([0-9]+)
{#IDNUM190}\s+Airflow_Temperature_Cel.*\s+[A-z-]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-z-_]+\s+([0-9]+)\s+\(Min/Max [0-9/]+\)

или нет для не которых значений одно и того же smatr id есть несколько вариантов в зависимости от производителей, не править же каждый раз регулярки дописывая их через | , по этому будем брать их из вывода макросом.

Будет так {#ATRIB}\s+[A-z-]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-z-_]+\s+([0-9]+)
"{#ATRIB}":"sdb:1 Raw_Read_Error_Rate"},
Начальные попытки скрипт
Показать
#!/bin/bash
# 2021.12.17 Артём Андреевич Мамзиков
# Скрипт мониторинга HDD с LLD для Zabbix (серверный вариант)

# Автообнаружение дисков

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
DISKNAME=$4

IFS=$'\n'
# (IFS оболочка считает, что пробел является границей слов делает пробелы между слов $* - отбрасывает символы и границы слов \n – это escape-последовательность для новой строки (переводится в новую строку)

if [[ $BLOCSCRIPT = "discoveryhdd" ]]
then
# Запускаем команду smartctl --scan-open |и ищем строки содержащие /dev/sd и передаем всё в переменную get
get=`zabbix_get -s $IP -p $PORT -k system.run["smartctl --scan-open"] | grep "/dev/sd"`
# Запускаем Цикл из переменной get
for hdd in $get
do
# получаем переменную DISK = Данные переменной get| ищем строки содержащие /dev/sd | вывести значение после /dev/ | оставляем первые 3 значение остальное убираем
DISKID=`echo $hdd | grep "/dev/sd" | sed "s/\/dev\///" | cut -c 1-3`
# После того как мы получили переменые для DISKID подставляем их (пример sda sdb)
# Проверяем что включен smart на данном диске ищем строку SMART support is: Enabled если ее нет ничего не выводим, при поиске по шаблону
#внутри [!=] сравнение строк SMART support is: Enabled = SMART support is: Enabled выполняется передаем дальше.
if [[ `zabbix_get -s $IP -p $PORT -k system.run["smartctl -i /dev/$DISKID"] | grep "SMART support is: Enabled"` != "" ]]
then
# Подстановка имен диска sda sdb и т.д.
DISKN=$DISKN"$SEP\n{\"{#DISKID}\":\"$DISKID\"}"
SEP=", "
# Запросим подерживаемые отрибуты диском, для создания элементов |первый столбец| только чистовое значение
IDN=`zabbix_get -s $IP -p $PORT -k system.run["smartctl -A /dev/"${DISKID}""]|awk '{print $1}'|egrep -o '[0-9]+'`
for IDNUM in $IDN
do
DISKN=$DISKN"$SEP\n{\"{#IDNUM$IDNUM}\":\"$DISKID:$IDNUM\"}"
SEP=", "
done

# Спискок имен диска в цонце вывода
# DISKNAME=$DISKNAME"$SEP\n{\"{#DISKNAME}\":\"$DISKID\"}"

JSON="${DISKN}"
fi
done

# Спискок имен диска в цонце вывода
#JSON="${DISKN}""${DISKNAME}"

# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"
fi


# Получение информации о дисках
# Получение информации входные переменные 2 и 3 пример ./smartctl.sh IP-hosta port sda info
if [[ $BLOCSCRIPT = "info" ]]
then
get=`zabbix_get -s $IP -p $PORT -k system.run["smartctl -x /dev/$DISKNAME"]`
for out in $get
do
echo $out
done
# Получение атрибутов входные переменные 2 и 3 пример ./smartctl.sh IP-hosta port sda attr
elif [[ $BLOCSCRIPT = "attr" ]]
then
get=`zabbix_get -s $IP -p $PORT -k system.run["smartctl -A /dev/$DISKNAME"]`
for out in $get
do
echo $out
done
fi
Разные варианты попытки шаблонов и скриптов
шаблон тест диски.zip
шаблон тест диски.zip
(2.53 МБ) 89 скачиваний
количество слов: 561
Аватара пользователя
Илья Лебедев
Гость
Сообщения: 1
Стаж: 2 года 11 месяцев

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Илья Лебедев »

Доброго времени суток, пытаюсь импортировать шаблон в Zabbix 5.4 (я так понял у вас 4.2). Висит - ждал минут 15 и ничего - ни ошибок, ни предложений. Что можно предпринять?
количество слов: 6
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Артём Мамзиков »

Илья Лебедев, Добрый вечер! Да шаблон выгружен с 4.2 , где то видал что на новую версию со старой не всегда загрузка идёт, как то вроде лечат. Где видел не помню в интернете поискать что пишут. Должна быть ошибка в логах веб сервера ,бд или самом заббиксе.
количество слов: 2
Аватара пользователя
Уланов Дима
Новичок
Сообщения: 13
Стаж: 2 года 9 месяцев
Благодарил (а): 2 раза

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Уланов Дима »

Не получает данные, но и не ругается что он не работает, smartctl инфу выдаёт в консоли, с сервера ./smartctl-lld.sh 192.168.0.5 info ничего не показывает, просто выполняет без ошибок
количество слов: 9
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Артём Мамзиков »

Уланов Дима, должна быть строка что Смарт включен SMART support is: Enabled если данной строки нет скрипт завершает работу.
Для windows должна быть доступна системная переменная так как заббикс агент работает от имени локальная система, обсуждалось в старой версии.
Так же в скрипте задан поиск дисков sda sdb и тд начинающихся на sd
количество слов: 8
Аватара пользователя
Уланов Дима
Новичок
Сообщения: 13
Стаж: 2 года 9 месяцев
Благодарил (а): 2 раза

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Уланов Дима »

А где иль куда её писать в zabbix агенте? если сидим в линукс
количество слов: 1
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Артём Мамзиков »

Уланов Дима,
Посмотри тут Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD через smartmontools
Команды тестирования на каком этапе нет данных

Пример для Linux пути могут отличатся
./usr/share/bash-completion/completions/smartctl
export PATH="/usr/share/bash-completion/completions/:$PATH"
После проверяем команды для smartmontools

Возможно дать права sudo chmod u+s /usr/sbin/smartctl

Так как Zabbix agent работает под пользователем Zabbix а команды проверяются под другим пользователем . Для данных пользователей будут отличатся права доступа и переменные, можно Zabbix agent запустить под root дать полные права , но это уже решает каждый сам
количество слов: 32
Аватара пользователя
Уланов Дима
Новичок
Сообщения: 13
Стаж: 2 года 9 месяцев
Благодарил (а): 2 раза

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Уланов Дима »

Спасибо, заработало!
количество слов: 0
Аватара пользователя
Vlad Larionov
Гость
Сообщения: 3
Стаж: 2 года 3 месяца
Благодарил (а): 1 раз
Контактная информация:

Обновленный Скрипт + Шаблон LLD Для проверки Жестких Дисков HDD SSD через smartmontools

Сообщение Vlad Larionov »

Илья Лебедев писал(а): Вт янв 18, 2022 19:10 Доброго времени суток, пытаюсь импортировать шаблон в Zabbix 5.4 (я так понял у вас 4.2). Висит - ждал минут 15 и ничего - ни ошибок, ни предложений. Что можно предпринять?
Такаяже проблема, кто-то смог решить ее ?
количество слов: 10
Ответить Вложения 16 Пред. темаСлед. тема

Вернуться в «Аппаратное обеспечение Общее для всех систем»