еще один вариант для ssh Скрипт + Шаблон LLD-SSH Для проверки Жестких Дисков по SMART HDD SSD через smartmontools
Чем меня не устроил предыдущий вариант, тем что он создает все элементы которые есть в узле, даже если таких кодов проверки нет на диске и висят они все в "Не поддерживается" более 50% можно конечно это все деактивировать выбрать фильтром для отображения но это не то.
Пример как это выглядит на узле с 2-мя дисками 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 является универсальным и указан для всех элементов, а имена дисков прилетели и все элементы опять создались в узле.
Если убрать из прототипов #DISKID и оставить только #IDNUM10 еще удалить зависимый элемент тогда создается то что нам нужно но при условии что зависимый элемент данных один, если их 2 создается только для 1го. Причем зависимый элементы данных обычный не прототип.
Были еще варианты создается прототип с диском но пустым кодом или с кодом но без диска.
По итогу нужны прототипы с одним зависимым обычным элементом данных (ибо не будем же для каждого когда делать внешний запрос) универсальный макрос для прототипов чисто #IDNUM указать нельзя все элементы опять выйдут, разные так же нельзя так как это не универсальный будет. Сработало с цифрами ставим в конце цифры и если они совпадают элемент создается.
#IDNUM20tt -так нельзя работать не будет #IDNUMцифры - так будет.
Про сам шаблон что получилось:
1. Добавлен порт по умолчанию 10050
2. Добавлено прототипов их теперь не 77 а прям 274 с запасом)
3. Элементы создаются те которые Поддерживаются диском
4. Регулярки прилетают макросом так как для одного кода может быть по 8 разных обозначений (имя ограничено 21 символом сокращения)
раньше код мог быть но элемент не поддерживался так как не совпадала регулярка!
JSONPath - на 4.2 не работает по этому только регулярка.
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. Уменьшен лог с информацией оставлена только не обходимая.
СКАЧАТЬ Скачать
В некоторых случаях в 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
[
{"{#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
Код: Выделить всё
#!/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
Регулярка
{#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
Так как заббикс не совсем понимает такую схему обнаружения. Скрипт для автоматической установки 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