Мониторинг HP Smart Array в Zabbix
В моем варианте я рассчитываю на мониторинг только одного слота т.е. (опция slot=) Измените номер слота в скрипте при необходимости.
net-analyzer/zabbix-2.0.4
Smart Array P212
ACU CLI Version: 8.70-8.0
SoulAPI Version: 5.2.64.0
Установка программы hpacucli в Ubuntu
apt-get install hpacucli
Примеры вывода команд hpacucli
/usr/sbin/hpacucli ctrl slot=1 ld all show status
logicaldrive 1 (931.5 GB, RAID 1): OK
/usr/sbin/hpacucli ctrl slot=1 pd all show status
physicaldrive 1I:1:1 (port 1I:box 1:bay 1, 1 TB): OK
physicaldrive 1I:1:2 (port 1I:box 1:bay 2, 1 TB): OK
/usr/sbin/hpacucli ctrl slot=1 pd all show detail
Smart Array P212 in Slot 1
array A
physicaldrive 1I:1:1
Port: 1I
Box: 1
Bay: 1
Status: OK
Drive Type: Data Drive
Interface Type: SATA
Size: 1 TB
Firmware Revision: 01.01V01
Serial Number: WD-WCAW33143216
Model: ATA WDC WD1003FBYX-0
SATA NCQ Capable: True
SATA NCQ Enabled: True
Current Temperature (C): 26
Maximum Temperature (C): 39
PHY Count: 1
PHY Transfer Rate: 3.0GBPS
physicaldrive 1I:1:2
Port: 1I
Box: 1
Bay: 2
Status: OK
Drive Type: Data Drive
Interface Type: SATA
Size: 1 TB
Firmware Revision: 01.01V01
Serial Number: WD-WCAW33098183
Model: ATA WDC WD1003FBYX-0
SATA NCQ Capable: True
SATA NCQ Enabled: True
Current Temperature (C): 26
Maximum Temperature (C): 34
PHY Count: 1
PHY Transfer Rate: 3.0GBPS
Установка скрипта
Создание папки для скриптов:
mkdir /etc/zabbix/scripts/
chown root:zabbix -R /etc/zabbix/scripts/
chmod 750 /etc/zabbix/scripts/
Создадим сам скрипт:
Листинг
/etc/zabbix/scripts/hpsmartarray.sh
#!/bin/bash
export LC_ALL=""
export LANG="en_US.UTF-8"
#
HPACUCLI="sudo /usr/sbin/hpacucli"
SLOT="1"
#
if [[ -n "$1" && -n "$2" && -z "$3" ]]; then
##### DISCOVERY #####
TYPE="$2"
if [[ "${TYPE}" == "ldiscovery" ]]; then
DRIVES=`${HPACUCLI} ctrl slot=${SLOT} ld all show status | awk '/logicaldrive/ {printf("Logical_%s\n", $2)}' | sed 's/:/./g'`
if [[ -n ${DRIVES} ]]; then
JSON="{ \"data\":["
SEP=""
for DRIVE in ${DRIVES}; do
JSON=${JSON}"$SEP{\"{#LD}\":\"${DRIVE}\"}"
SEP=", "
done
JSON=${JSON}"]}"
echo ${JSON}
fi
exit 0
elif [[ ${TYPE} == "pdiscovery" ]]; then
DRIVES=`${HPACUCLI} ctrl slot=${SLOT} pd all show status | awk '/physicaldrive/ {printf("Physical_%s\n", $2)}' | sed 's/:/./g'`
if [[ -n ${DRIVES} ]]; then
JSON="{ \"data\":["
SEP=""
for DRIVE in ${DRIVES}; do
JSON=${JSON}"$SEP{\"{#PD}\":\"${DRIVE}\"}"
SEP=", "
done
JSON=${JSON}"]}"
echo ${JSON}
fi
exit 0
else
exit 1
fi
elif [[ -n "$1" && -n "$2" && -n "$3" ]]; then
##### PARAMETERS #####
RESERVED="$1"
DRIVE="$2"
METRIC="$3"
CACHE_TTL="50"
CACHE_FILE="/tmp/zabbix.hpsmartarray.cache"
EXEC_TIMEOUT="5"
NOW_TIME=`date '+%s'`
##### RUN #####
if [ -s "${CACHE_FILE}" ]; then
CACHE_TIME=`stat -c"%Y" "${CACHE_FILE}"`
else
CACHE_TIME=0
fi
DELTA_TIME=$((${NOW_TIME} - ${CACHE_TIME}))
#
if [ ${DELTA_TIME} -lt ${EXEC_TIMEOUT} ]; then
sleep $((${EXEC_TIMEOUT} - ${DELTA_TIME}))
elif [ ${DELTA_TIME} -gt ${CACHE_TTL} ]; then
echo "" >> "${CACHE_FILE}" # !!!
DATACACHE=`${HPACUCLI} ctrl slot=${SLOT} ld all show status | awk '{print $1,$2,$NF}' | awk '/logicaldrive/ {printf("Logical_%s Status:%s\n", $2, $3)}';
${HPACUCLI} ctrl slot=${SLOT} pd all show detail | sed '/physicaldrive/ s/:/./g; s/\(physicaldrive\)/\1:/g' | awk -F':' '
function ltrim(s) { sub(/^[ \t]+/, "", s); return s }
function rtrim(s) { sub(/[ \t]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
/physicaldrive/ {fd_counter+=1; fd[fd_counter]=trim($2)}
/^[ \t]+Status/ {status[fd_counter]=trim($2)}
/Serial Number/ {serial[fd_counter]=trim($2)}
/Current Temperature/ {temperature[fd_counter]=trim($2)}
END {
for (i=1; i<=fd_counter; i+=1) {
printf ( "Physical_%s Status:%s\n", fd[i], status[i]);
printf ( "Physical_%s Serial:%s\n", fd[i], serial[i]);
printf ( "Physical_%s Temperature:%s\n", fd[i], temperature[i]);
}
}'`
echo "${DATACACHE}" > "${CACHE_FILE}" # !!!
chmod 640 "${CACHE_FILE}"
fi
#
cat "${CACHE_FILE}" | grep -iw "${DRIVE}" | awk -F':' 'BEGIN{IGNORECASE=1} /'${METRIC}'/ {print $2}' | head -n1
exit 0
#
else
exit 1
fi
Скрипт поддерживает обнаружение (discovery) логических и физических дисков.
Скрипт предусматривает кэш, что позволяет сократить количество реальных обращений к серверу.
Время действия кэша в секундах должно устанавливается чуть меньше чем минимальный период опроса элементов (CACHE_TTL + EXEC_TIMEOUT < T).
Т.к. hpacucli работает медленно, необходимо увеличить Timeout Zabbix Agent'a, и при необходимости увеличить EXEC_TIMEOUT в скрипте
Установка прав
chown root:zabbix /etc/zabbix/scripts/hpsmartarray.sh
chmod 700 /etc/zabbix/scripts/hpsmartarray.sh
Настройка прав пользователю zabbix в sudo
/etc/sudoers
...
##### CUSTOM #####
zabbix ALL=(ALL) NOPASSWD: /usr/sbin/hpacucli ctrl slot=1 ld all show status
zabbix ALL=(ALL) NOPASSWD: /usr/sbin/hpacucli ctrl slot=1 pd all show status
zabbix ALL=(ALL) NOPASSWD: /usr/sbin/hpacucli ctrl slot=1 pd all show detail
Проверить работу скрипта для zabbix:
sudo -u zabbix /etc/zabbix/scripts/hpsmartarray.sh none ldiscovery
sudo -u zabbix /etc/zabbix/scripts/hpsmartarray.sh none pdiscovery
sudo -u zabbix /etc/zabbix/scripts/hpsmartarray.sh none "Physical_1I.1.1" status
sudo -u zabbix /etc/zabbix/scripts/hpsmartarray.sh none "Physical_1I.1.1" temp
Вы должны получить данные, если этого не произошло, то конфигурация выполнена не правильно.
Настройка Zabbix сервера
Вызов скрипта через zabbix-agent
Настройка
/etc/zabbix/zabbix_agentd.conf
...
UserParameter=hpsmartarray[*],/etc/zabbix/scripts/hpsmartarray.sh "none" "$1" "$2"
Перезапустить
/etc/init.d/zabbix-agentd restart
Проверка
zabbix_get -s HOST -k 'hpsmartarray[Physical_1I.1.1, temp]'
Для контролируемых данных в Zabbix нужно создать соответствующее элементы с типом «Zabbix агент» и ключом типа:
hpsmartarray[disk, key]
где disk - имя логического диска Logical_<X> или физического диска Physical_<X>
key - контролируемая метрика
Готовый Шаблон для мониторинга HP Smart Array (agent) с уже настроенными элементами и графиками.
Результат
Пример графиков:
Изображения не найдены
Обсуждение
Здравствуйте, Во первых спасибо за сайт и особенно за информацию на нем очень много полезного - написанно просто и доступно и главное Работает!!! Хотел обратится с просьбой есть ли возможность опубликовать скрипт для windows 2008 - очень нужно - утилитку hpacucli под винду нашел а вот скрипта нет - ОЧЕНЬ НУЖЕН
тоже касается статей
Мониторинг параметров IOSTAT в Zabbix
Мониторинг параметров S.M.A.R.T. в Zabbix
НУ ОЧЕНЬ НЕОБХОДИМО версии под windows
к сожалению с этим я не смогу помочь
Zabbix version: 2.4.5
Не работают Discovery rules:
hpsmartarray[ldiscovery], hpsmartarray[ldiscovery]
Value should be a JSON object
zabbix_agentd -t 'hpsmartarray[ldiscovery]'
hpsmartarray[ldiscovery] [t|{"data":[{"{#LD}":"Logical_1"}]}]
# zabbix_agentd -t 'hpsmartarray[pdiscovery]'
hpsmartarray[pdiscovery] [t|{"data":[{"{#PD}":"Physical_1I.1.1"},{"{#PD}":"Physical_1I.1.2"},{"{#PD}":"Physical_1I.1.3"},{"{#PD}":"Physical_1I.1.4"}]}]
http://jsonlint.com/ - говорит, что JSON валидный.
# sudo -u zabbix /etc/zabbix/scripts/hpsmartarray.sh none ldiscovery
{"data":[{"{#LD}":"Logical_1"}]}
# sudo -u zabbix /etc/zabbix/scripts/hpsmartarray.sh none pdiscovery
{"data":[{"{#PD}":"Physical_1I.1.1"},{"{#PD}":"Physical_1I.1.2"},{"{#PD}":"Physical_1I.1.3"},{"{#PD}":"Physical_1I.1.4"}]}
В чем может быть ошибка?
Итак, решение проблемы:
Включаем режим отладки в zabbix_agentd.conf
Перезапускаем заббикс-агент:
В логе /var/log/zabbix/zabbix_agentd.log находим причину ошибки:
Отключаем параметр requiretty в /etc/sudoers:
visudo
Проблема решена:
Discovery rules на хосте теперь без ошибок.
Автоматически созданы элементы и тригеры шаблона MyTemplate_HP_Smart_Array_agent
Спасибо автору шаблона и скрипта.
Отключаем режим отладки в zabbix_agentd.conf
Удаляем строку: DebugLevel=4
Перезапускаем заббикс-агент:
Добрый день Спасибо за скрипт - пригодился. Только вот не задача… Создает кеш файл в одну строку, \n не срабатывает (видимо из-за обилия различных кавычек)… Подскажите как можно решить данный вопрос.
Вижу кое-что добавили, но остальное плохо скопировали, найдите 2 отличия
кавычки для переменной возможно помогут
Да, спасибо, недосмотрел действительно. Изменил, да - собираю информацию не через ssh, а средством esxcli. Спасибо еще раз ;)
Добрый день !
А не подскажите если клиентская машина под Windows.
У меня получичается снять полный блок данны через ctrl slot=0 pd all show detail
но как мне сделать чтоб он сам искал диски, и мониторил каждый диск по отдельности
Добрый день. В моем случае скрипт выдавал "Status OK" даже на неисправном диске, т.к. вместо строки "Status: Predictive Failure" анализировал эту: "Drive Authentication Status: OK". Изменил паттерн:
на это
красная лампочка зажглась.
Спасибо, учел ваши замечания. На P410i -"Authentication Status" нет, а на P220i есть
Стабильно вылезает вот такое: /etc/zabbix/scripts/hpsmartarray.sh: line 60: /tmp/zabbix.hpsmartarray.cache: Permission denied /etc/zabbix/scripts/hpsmartarray.sh: line 76: /usr/bin/sudo: Permission denied /etc/zabbix/scripts/hpsmartarray.sh: line 77: /usr/bin/sudo: Permission denied /etc/zabbix/scripts/hpsmartarray.sh: line 77: /tmp/zabbix.hpsmartarray.cache: Permission denied
Никак не могу понять каких прав ему не хватает. Права на этот файл дал /tmp/zabbix.hpsmartarray.cache (овнером поставил акк забикса) по прошествии времени опять права слетают.
Centos 7 (XENSERVER)
Для тех у кого не запускается так
просто добавьте "sudo" после "zabbix"
и добавьте запуск скрипта в /etc/sudoers - иначе пароль спрашивает
МНЕ ПОМОГЛО !
При выполнении zabbix_get -s HOST -k 'hpsmartarray[Physical_1I.1.1, temp]' ZBX_NOTSUPPORTED: Unsupported item key. Что можно сделать?
Вместо temp напишите Temperature (обязательно с большой буквы)
В скрипте три параметра Status Serial Temperature
Проверять нужно так
Давно успешно пользуюсь скриптом, добром и теплом вспоминаю автора с благодарностью. Заметил несущественный недостаток: при проблемах с массивом заббикс получает неполные сведения, пример: OK ⇒ OK Interim Recovery Mode ⇒ Mode Recovering, 99.16% complete ⇒ complete Причиина очевидна: AWK с пробелом-разделителем выделяет только последнее слово, а надо бы все после ":", но как на ходу поменять разделитель, не нашел.
Буду очень признателен за помощь.