ZABBIX: мониторим состояние 3Ware RAID при помощи smartctl и tw_cli
Вступление
Имеется древний сервер на базе AMD Opteron, с hardware-raid 3Ware на борту.
Задача – мониторить состояние массива RAID (виртуальных дисков) и состояние физических дисков.
Для получения статуса будем использовать следующие утилиты командной строки:
- smartctl для определения состояния физических дисков
- tw_cli для определения состояния виртуальных дисков
Реализация
Установка драйверов 3dm2 и 3DM2_CLI остается за пределами статьи.
Настраиваем мониторинг через tw_cli
Для начала нам нужно разобраться какие и сколько физических дисков установлено, какие raid массивы сконфигурированы
Смотрим контроллеры в системе:
# tw_cli info Ctl Model (V)Ports Drives Units NotOpt RRate VRate BBU ------------------------------------------------------------------------ c0 9550SX-8LP 8 8 2 0 1 1 OK Смотрим информацию по дискам для контроллера: # tw_cli info c0 Unit UnitType Status %RCmpl %V/I/M Stripe Size(GB) Cache AVrfy ------------------------------------------------------------------------------ u0 RAID-10 VERIFY-PAUSED - 31% 64K 596.025 ON ON u1 RAID-10 VERIFY-PAUSED - 11% 64K 1862.62 ON ON Port Status Unit Size Blocks Serial --------------------------------------------------------------- p0 OK u0 298.09 GB 625142448 WD-WCAPD3238373 p1 OK u0 298.09 GB 625142448 WD-WCAPD3238175 p2 OK u1 931.51 GB 1953525168 WD-WCAW36356801 p3 OK u0 298.09 GB 625142448 WD-WCAPD2763550 p4 OK u0 298.09 GB 625142448 WD-WCAPD3238222 p5 OK u1 931.51 GB 1953525168 WD-WCAW36356733 p6 OK u1 931.51 GB 1953525168 WD-WCAW36252351 p7 OK u1 931.51 GB 1953525168 WD-WCAW36329061 Name OnlineState BBUReady Status Volt Temp Hours LastCapTest --------------------------------------------------------------------------- bbu On Yes OK OK OK 255 25-Jan-2012
Нас будет интересовать колонка Status.
Для получения статуса raid, дисков или батареи используются следующие команды:
tw_cli /c0 show unitstatus tw_cli /c0 show bpustatus tw_cli /c0 show drivestatus
Пользовательский параметр назовем raid_status[*]
где в качестве параметра ключа будет передаваться unit
, drive
или bbu
.
Для вычисления значений будем использовать такую строчку:
/usr/local/bin/tw_cli /c0 show $1status | awk '(! /^[[:space:]]*$/) && (NR>3) {print $2 $3 $4}' | grep -v OK | grep -v VERIFY | wc -l
Эта команда отбрасывает пустые строки, отбрасывает первые три строки заголовка, и проверяет есть ли в полях 2, 3, 4 слово OK, если слова нет, то выдает количество таких строк.
Мониторинг через smartctl
Параметры дисков нужно смотреть вот примерно такой вот командой:
smartctl -a -d 3ware,0 /dev/twa0
Где 3ware,0
– это физический диск, twa0
– это контроллер.
Эта команда выведет все показатели smart. Нас интересует по сути только информация об общем состоянии диска и количество сбойных секторов:
# smartctl -a -d 3ware,0 /dev/twa0 | grep overall-health | awk '{print $6}' PASSED # smartctl -a -d 3ware,0 /dev/twa0 | grep Reallocated_Sector_Ct | awk '{print $10}' 0
Пользовательские параметры назовем smart_health[*]
и smart_reallocated_sectors_count[*]
, где “*” – номер диска.
А теперь самое интересное.. для доступа к tw_cli
и /dev/twa0
нужно обладать правами root. Поскольку мы не хотим, что бы zabbix имел доступ к этим жизненно важным файлам в системе, то будем использовать zabbix_trapper (запускать по cron скрипт, который будет передавать значения параметров в zabbix-сервер).
Итак, сделаем два скрипта:
/etc/zabbix/zabbix_raid_health.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 | #! /bin/bash zabbix_sender='/usr/bin/zabbix_sender' conf='/etc/zabbix/zabbix_agentd.conf' tw_cli='/usr/local/bin/tw_cli' controller='c0' params="unit drive bbu" for param in $params; do status=`$tw_cli /$controller show $param"status"| awk '(! /^[[:space:]]*$/) && (NR>3) {print $2 $3 $4}' | grep -v OK | grep -v VERIFY | wc -l` $zabbix_sender -c $conf -k raid_status[$param] -o $status done |
/etc/zabbix/zabbix_smartctl.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #! /bin/bash zabbix_sender='/usr/bin/zabbix_sender' conf='/etc/zabbix/zabbix_agentd.conf' smartctl='/usr/sbin/smartctl' controller='twa0' disks="0 1 2 3 4 5 6 7" for disk in $disks; do status=`smartctl -a -d 3ware,$disk /dev/$controller | grep overall-health | awk '{print $6}'` reallocated_sectors=`smartctl -a -d 3ware,$disk /dev/$controller | grep Reallocated_Sector_Ct | awk '{print $10}'` $zabbix_sender -c $conf -k smart_health[$disk] -o $status $zabbix_sender -c $conf -k smart_reallocated_sectors_count[$disk] -o $reallocated_sectors done |
запихиваем эти скрипты в cron /etc/cron.d/zabbix
(запускать каждый час):
echo "1 */1 * * * root /etc/zabbix/zabbix_raid_health.sh > /dev/null 2>&1" >> /etc/cron.d/zabbix echo "2 */1 * * * root /etc/zabbix/zabbix_smartctl.sh > /dev/null 2>&1" >> /etc/cron.d/zabbix
Далее импортируем шаблон Template_3ware_RAID.xml в zabbix и подключаем к хосту.