Приветствую всех,

В заметке на сегодня хотелось бы поделиться информацией относительно мониторинга физических дисков и аппаратных рейд-контроллеров на серверах с proxmox на борту.

Сервера с аппаратным raid, задачи управления массивом, контроля челостности и распределения данных по физическим дискам перекладывают на raid-контроллер. Хост-системе за счет аппаратного обеспечения предосталяется один логический диск, при этом система и понятия не имеет о фактическом типе и количестве установленных дисков.

mon-disks-schemes.png (Схема с аппаратным raid)

Исходя из этого, может возникнуть вопроc.. Если же система видит только один большой логический диск, то как нам следить за состоянием физических дисков установленных в систему? - На самом деле все просто. Из коробки без установки дополнительного софта, мы сложем посмотреть просмотреть SMART на физических дисках при помощи утилиты smartctl.

Смотрим SMART

На DELL серверах, для обнаружения дисковых устройств выполняем команду:

root@prox02:~# smartctl --scan
--
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/sdb -d scsi # /dev/sdb, SCSI device
/dev/bus/0 -d megaraid,0 # /dev/bus/0 [megaraid_disk_00], SCSI device
/dev/bus/0 -d megaraid,1 # /dev/bus/0 [megaraid_disk_01], SCSI device
/dev/bus/0 -d megaraid,2 # /dev/bus/0 [megaraid_disk_02], SCSI device
/dev/bus/0 -d megaraid,3 # /dev/bus/0 [megaraid_disk_03], SCSI device

Как можно понять из вывода, утилитой было обнаружено 6 устройств. Два логических - /dev/sda, /dev/sdb и 4 физических диска - megaraid,0/1/2/3. По логическим дискам (/dev/sda, /dev/sdb) вывод не особо будет полезен в нашем случаи, так как у такого типа дисков смарт не поддерживается.

Для остальных, мы можем проверить состояние смарт:

root@prox02:~# smartctl -a /dev/sdb -d megaraid,0
root@prox02:~# smartctl -a /dev/sdb -d megaraid,1
root@prox02:~# smartctl -a /dev/sdb -d megaraid,2
root@prox02:~# smartctl -a /dev/sdb -d megaraid,3

На HPE серверах, по какой-то причине смарт не находит какие-либо устройства. Но при попытке запросить информацию через утилиту, получаю такой вывод:

root@prox01:~# smartctl -a /dev/sda
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.15.102-1-pve] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

/dev/sda: requires option '-d cciss,N'
Please specify device type with the -d option.

Use smartctl -h to get a usage summary

В данном случаи, нам говорится что запроса информации по устройству /dev/sda, требуется использовать опцию -d cciss,N, где N номер диска.

Соответственно воспользовавшись подсказкой, получилось просмотреть информацию по дискам используя такие команды.

root@prox01:~# smartctl -a /dev/sda -d cciss,0
root@prox01:~# smartctl -a /dev/sda -d cciss,1
root@prox01:~# smartctl -a /dev/sda -d cciss,2
root@prox01:~# smartctl -a /dev/sda -d cciss,3

Если же по какой-то причины получаем сообщение о выключенном смарт, то включить его можно командой:

# Для Dell
root@prox02:~# smartctl -s on /dev/sdb -d megaraid,0
# Для HP
root@prox01:~# smartctl -s on /dev/sdb -d cciss,0

После включения, можем еще проверить состояние диска сделав суммарный вывод. Для это к уже известной нам команде добавляем ключ -H/--health:

# Для Dell:
root@prox02:~# smartctl -H /dev/sdb -d megaraid,0
...
=== START OF READ SMART DATA SECTION ===
SMART Health Status: OK
Percentage used endurance indicator: 9%

# Для HP
root@prox01:~# smartctl -H /dev/sda -d cciss,0
...
=== START OF READ SMART DATA SECTION ===
SMART Health Status: OK
Percentage used endurance indicator: 11%

Показатели хорошего статуса, не должны внушать вам полное спокойствие. Важно с периодичностью выполнять проверки состояния дисков через самотестирование.

При помощи утилиты мы можем выполнить, на выбор, три типа самотестирования - short, long, conveyance.

  • short - самый быстрый вариант самотестирования, который с высокой вероятностью может выявить какие либо ошибки.
  • long - аналогичный вариант, что и первый, за исключением безграничного времени. И в этом случаи полностью проверяется вся поверхность диска.
  • conveyance - тут не однозначно, но как я понял этот вариант может быть полезен для устроств которые могли получить повреждения по время транспортировки.

После тестов, статус может быть обновлен. Но более детальнее стоит обращать внимание результаты тестирования:

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%      7507         -

В моем случаи Completed without error - означает что тест завершен без ошибок.

По мимо этого, стоит обращать внимание на поле SMART Error Log:

SMART Error Log Version: 1
No Errors Logged

Здесь в выводе - No Errors Logged говорится, что никаких ошибок не было обнаружено. Значит с диском никаких проблем нету.

Настраиваем smartd

Думаю для старта этой информации достаточно, в заключение это главы хочу отметить что в пакет smartmontools, входит системый демон - smartd. Перенастроив его конфиг мы можем проводить регулярные тесты в не рабочие часы. И дополнительно есть возможность отправлять уведомления на почту, в случаи возникновения ошибок по дискам.

Настроим smartd на проверку диска один раз/два неделю, и плюс напишем скриптик для отправки ошибок в телеграмм.

Деволтный конфиг переименуем и напишем новый.

root@prox02:~# mv /etc/smartd.conf /etc/smartd.conf.bk

В конфиге по умолчанию все опции закоментированы, кроме одного параметра - DEVICESCAN, который в свою очередь настраивает smartd на автоматический рескан дисков с последующим тестированием. Опции которые следуют после DEVICESCAN, будут проигнорированы сервисом.

Для нас такой расклад не подходит, мы же будем указывать прямые ссылки к дискам (Так как на некоторых серверах сканирование не определяет устройства).

Итак, пишем конфигу:

root@prox01:~# vim /etc/smartd.conf
---
# Simple config-file for smartd.

# Default settings:
DEFAULT -a -m <TELEGRAM_CHAT_ID> -M exec /usr/local/bin/telegram_notify.sh \
    -M test \
    -M once \
    -R 194 \
    -S on \
    -W 5,55,65

# Scan device /dev/sda. (Saturday 01-03am)
/dev/sda -d cciss,0 -s L/../../6/01
/dev/sda -d cciss,1 -s L/../../6/02
/dev/sda -d cciss,2 -s L/../../6/03

# Scan device /dev/sdb (Saturday 04am)
/dev/sdb -d cciss,3 -s L/../../6/04

# Scan device /dev/sdc (Sunday, 01-02am)
/dev/sdc -d cciss,4 -s L/../../7/01
/dev/sdc -d cciss,5 -s L/../../7/02

В самом начале конфига строка начинающаяся с агрумента DEFAULT опредяет общие настройки для сканирования по каждому диску. Данная строчка состоит из параметров:

  • -a - данный аргумент эквивалентен команде smartctl c ключами - -H -f -t -l error -l selftest -C 197 -U 198,
  • -m <TELEGRAM_CHAT_ID> - c помошью этого агрумента мы передаем адрес telegram id,
  • -M exec /usr/local/bin/telegram_notify.sh - здесь мы указываем, что для отправки сообщения нужно выполнить скрипт,
  • -M test \ - эта опция отправит тестовое сообщение, при запуске службы smartd,
  • -M once \ - а эта опция настраивает отправку ошибок только один раз,
  • -R 194 \ - с помошью этой директивы мы включаем отслеживание изменений по ID. В данной случаи мы следим за температурой,
  • -S on \ - здесь включаем автосохранение атрибутов при запуске службы
  • -W 5,55,65 - тут мы устанавливаем лимиты на температуру. В данном случаи мы хотим при достижении 55 градусов (второе число) считать как предупреждение. Затем при достижении 65 градусов (третье число) репортнуть нам о кретической температуре.

Когда дефолтные настройки определены, определяем диски. В моей примере я сгруппировал все физические диски по отношению к логическим, что представлены в системе. Для понимания указал комментарии к каждой группе.

# Scan device /dev/sda. (Saturday 01-03am)
/dev/sda -d cciss,0 -s L/../../6/01
/dev/sda -d cciss,1 -s L/../../6/02
/dev/sda -d cciss,2 -s L/../../6/03

# Scan device /dev/sdb (Saturday 04am)
/dev/sdb -d cciss,3 -s L/../../6/04

# Scan device /dev/sdc (Sunday, 01-02am)
/dev/sdc -d cciss,4 -s L/../../7/01
/dev/sdc -d cciss,5 -s L/../../7/02

В конце каждой строки указывается расписание через аргумент -s с указанием времени, когда мы хотим запускать сканирование. В моем кейсе я настроил запуск проверки на субботу/воскресенье в ночные часы. Синтаксис времени такой - T/MM/DD/d/HH.

Собственно на выходе получаем базовый конфиг, теперь нам остается только написать bash-скриптец для отправки сообщений.

Для скрипта нам понадобится api-токен от бота и chat-id от группы куда мы будем отправлять сообщения. Далее в редакторе открываем файл будушего скрипта, и добавляем строчки:

root@prox01:~# vim /usr/local/bin/telegram_notify.sh
---
#!/bin/bash

API_TOKEN="<BOT_TOKEN>"
CHAT_ID=$SMARTD_ADDRESS

MESSAGE="SMART ALERT on $(hostname -f)"$'\n'"--"$'\n'"Disk: $SMARTD_DEVICESTRING"$'\n'"Info: $SMARTD_MESSAGE"

curl -s -d "chat_id=-100${CHAT_ID}" --data "text=$MESSAGE" "https://api.telegram.org/bot${API_TOKEN}/sendMessage"

Перед запуском скрипта, smartd в переменные окружения добавляет несколько служебных переменных. И в данном случаи мы используем некоторые:

  • $SMARTD_ADDRESS - В значении этой переменной передается адрес телеграмм канала, куда нужно будет отправить сообшение. Ранее этот адрес вы указывали в дефолтной конфигурации /etc/smartd.conf.
  • $SMARTD_DEVICESTRING - эта переменная содержит информацию по диску.
  • $SMARTD_MESSAGE - и тут непосредственно информация по событию.

Работа над настройкой закончена, теперь для проверки можем просто перезапустить сервис smartd:

root@prox01:~# systemctl restart smartd

И в телегу прилетит несколько сообщений: mon-disks-tg.png

Отчасти такой подход частично решает нашу задачу. Но у нас по прежнему нет понимания о количестве установленных дисках и типе используемого raid-level.

Получить эту информацию, предоставляется возможным, через установку дополнительного софта, который взаимодествует с raid-контроллером непосредственно напрямую через интерфейс командной строки.

Преимущественно для HP серверов, ставится утилита ssacli (smart storage admin command line interface), она поддерживают работу только с контроллерами HP Smart Array. Для Dell серверов и контроллеров MegaRAID используется аналог утилита - megacli. (Кстати говоря, на серверах Lenovo, тоже ставятся контроллеры MegaRAID)

Установка megacli

Установка на дебиан достаточно тривиальная. Сначала прикручиваем репозиторий:

root@prox02:~# CODENAME=$(cat /etc/os-release | grep -i codename | awk -F'=' '{print $2}')
root@prox02:~# wget -O - https://hwraid.le-vert.net/debian/hwraid.le-vert.net.gpg.key | apt-key add -
root@prox02:~# echo " deb http://hwraid.le-vert.net/debian $CODENAME main " > /etc/apt/sources.list.d/raidtool.list

Далее устанавливаем пакеты:

root@prox02:~# apt update
root@prox02:~# apt install megacli

Теперь для просмотра информации по физическим дискам, достаточно воспользоваться командой:

root@prox02:~# megacli -PDList -aALL

Что бы просмотреть информацию по логическим дискам и их raid-level, можно воспользоваться командой:

root@prox02:~# megacli -LDInfo -Lall -aALL

А для просмотра состояния батарейки контроллера, можно воспользоваться командой:

root@prox02:~# megacli -AdpBbuCmd -aAll

Установка ssacli

На HPE-сервера установка также достаточно простая. Добавляем репозиторий:

root@prox01:~# echo "deb http://downloads.linux.hpe.com/SDR/repo/mcp stretch/current non-free" > /etc/apt/sources.list.d/hp-mcp.list
root@prox01:~# wget -q -O - http://downloads.linux.hpe.com/SDR/hpPublicKey1024.pub | apt-key add -
root@prox01:~# wget -q -O - http://downloads.linux.hpe.com/SDR/hpPublicKey2048.pub | apt-key add -
root@prox01:~# wget -q -O - http://downloads.linux.hpe.com/SDR/hpPublicKey2048_key1.pub | apt-key add -
root@prox01:~# wget -q -O - http://downloads.linux.hpe.com/SDR/hpePublicKey2048_key1.pub | apt-key add -

Далее инсталим пакет:

root@prox01:~# apt update
root@prox01:~# apt install ssacli

Все подготовлено к использованию. Для проверки состояния контроллера, достаточно воспользоваться командой:

root@prox01:~# ssacli ctrl all show status
---
Smart Array P440ar in Slot 0 (Embedded)
   Controller Status: OK
   Cache Status: Not Configured
   Battery/Capacitor Status: OK

Что бы просмотреть текущую конфигурацию дисковой состовляющей, достаточно воспользоваться командой:

root@prox01:~# ssacli ctrl all show config

Для вывода информации по логическим дискам, команда:

root@prox01:~# ssacli ctrl slot=0 ld all show

И команда для листинга вывода по физическим дискам:

root@prox01:~# ssacli ctrl slot=0 pd all show

Создание Raid1

В процессе написания этой заметки, пришлось на сервере создать еще один массив из двух дисков. Поэтому так же решил отметить и этот момент. Для начала id дисков:

root@prox01:~# ssacli ctrl slot=0 pd all show

Smart Array P440ar in Slot 0 (Embedded)

   Array A

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SATA SSD, 800 GB, OK)
      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA SSD, 800 GB, OK)
      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA SSD, 800 GB, OK)

   Array B

      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SATA SSD, 1 TB, OK)

   Unassigned

      physicaldrive 2I:1:5 (port 2I:box 1:bay 5, SATA SSD, 2 TB, OK)
      physicaldrive 2I:1:6 (port 2I:box 1:bay 6, SATA SSD, 2 TB, OK)

В группе Unassigned имеется два диска - 2I:1:5, 2I:1:6.

Из этих двух дисков собираем raid 1:

root@prox01:~# ssacli ctrl slot=0 create type=ld drives=2I:1:5,2I:1:6 raid=1

Далее повторно выводим листинг дисков:

root@prox01:~# ssacli ctrl slot=0 pd all show

Smart Array P440ar in Slot 0 (Embedded)

   Array A

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SATA SSD, 800 GB, OK)
      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA SSD, 800 GB, OK)
      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA SSD, 800 GB, OK)

   Array B

      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SATA SSD, 1 TB, OK)

   Array C

      physicaldrive 2I:1:5 (port 2I:box 1:bay 5, SATA SSD, 2 TB, OK)
      physicaldrive 2I:1:6 (port 2I:box 1:bay 6, SATA SSD, 2 TB, OK)

Как видно из листинга появилась новая группа.

Проблема с диском

Был еще один кейс, когда на сервере вылетел винт и нужно было идентифицировать проблемный диск.

Подключаемся на сервер, и выводим в консоле информацию по всем контроллерам:

[root@db ~]# hpacucli ctrl all show status

Smart Array P410i in Slot 0 (Embedded)
   Controller Status: OK
   Cache Status: OK
   Battery/Capacitor Status: OK

Так как сервер работает под управлением старой redhat-подобной операционной системе, тут ранее уже была предустановлена утилита hpacucli.

По сути это тоже самое что и ssacli, синтаксис аналогичный. Данный вывод вернет нам информацию по всем контроллерам, в нашем случаи у нас имеется один аппаратный raid-контроллер.

Далее смотрим информацию по логическому диски, командой:

[root@db ~]# hpacucli ctrl slot=0 ld all show

Smart Array P410i in Slot 0 (Embedded)

   array A

      logicaldrive 1 (558.7 GB, RAID 1+0, OK)

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

Капнем немного дальше, и залистим детальную информацию по логическому диску.

[root@db ~]# hpacucli ctrl slot=0 ld all show detail

Smart Array P410i in Slot 0 (Embedded)

   array A

      Logical Drive: 1
         Size: 558.7 GB
         Fault Tolerance: 1+0
         Heads: 255
         Sectors Per Track: 32
         Cylinders: 65535
         Strip Size: 256 KB
         Full Stripe Size: 512 KB
         Status: OK
         Caching:  Enabled
         Unique Identifier: 600508B1001C53564E8213B5611D6DD4
         Disk Name: /dev/sda
         Mount Points: /boot 500 MB, /cagefs 19.5 GB, /usr 9.8 GB, /var 9.8 GB, / 6.8 GB, /tmp 5.9 GB, /dbs 426.5 GB
         OS Status: LOCKED
         Logical Drive Label: A89C83B95001438021528EC029C5
         Mirror Group 0:
            physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 300 GB, Failed)
            physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS, 300 GB, OK)
         Mirror Group 1:
            physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SAS, 300 GB, OK)
            physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SAS, 300 GB, OK)
         Drive Type: Data

В этом листинге уже видна явная проблема с первым диском из mirror-group 0. Так как сервер в продакшене, мы в срочном порядке поменяли его. К сожалению не удалось более детальнее проверить диск через smartсtl.

После горячей замены диска должно пройти некоторое время для ребилда массива. Отобразить статус удалось командой:

[root@db ~]# hpacucli ctrl Slot=0 show config

Smart Array P410i in Slot 0 (Embedded)    (sn: 5001438021528EC0)

   array A (SAS, Unused Space: 0  MB)


      logicaldrive 1 (558.7 GB, RAID 1+0, OK)

      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 500 GB, OK, Rebuilding)
      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS, 300 GB, OK)
      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SAS, 300 GB, OK)
      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SAS, 300 GB, OK)

   SEP (Vendor ID PMCSIERA, Model  SRC 8x6G) 250 (WWID: 5001438021528ECF)

Через время все диски должны быть в статусе OK. (Еще один момент, у нас под рукой не нашлось SAS диска на 300gb и мы поставили диск на 500gb и все завелось =))

Мониторим raid-контроллер

Для мониторинга дисков и raid-контроллера напишем скриптец, и далее создадим шаблон для Zabbix. При помощи скрипта будем находить/дискаверить новые объекты и смотреть статус по ним. Заметка получилась громоздкой и чтобы еще более не перегружать ее, реализуем мониторинг только контроллеров HPE. (В будущем дополню и для megaraid контроллера)

Пишем скриптец

Собственно сам сценарий:

#!/bin/bash

## Usage example:
## -- 
## bash script_name.sh DiscoveryCtrl (Discovery controllers)
## bash script_name.sh DiscoveryPhDisk <controller_id> (Discovery physical disks)
## 


ACTION=$1
CTRL=$2
OBJECT_ID=$3


function DiscoveryCtrl() {
        #TODO: Update func, for discovery multiple controllers

        CTRL_SLOT=$(ssacli ctrl all show detail | grep -iE "slot: *" | cut -f2 -d":" | sed 's/ //g')
        CTRL_MODEL=$(ssacli ctrl slot=${CTRL_SLOT} show | grep -i "Slot ${CTRL_SLOT}" | awk -F"in" '{print $1}')
        CTRL_SERIAL=$(ssacli ctrl slot=${CTRL_SLOT} show | sed 's/ //g' | grep -iE "^serialnumber" | cut -f2 -d":")
        JSON_CTRL="{\"{#CTRL_SLOT}\":\"${CTRL_SLOT}\",\"{#CTRL_MODEL}\":\"${CTRL_MODEL}\",\"{#CTRL_SERIAL}\":\"${CTRL_SERIAL}\"}"

        echo "{\"data\":[$(echo ${JSON_CTRL} | sed -e 's/,$//')]}"
}


function DiscoveryLogicalDisk() {
        LD_IDS=$(ssacli ctrl slot=$1 ld all show detail | sed 's/ //g' | grep -i "logicaldrive:" | cut -f2 -d":")
        JSON_LD=''

        for LD_ID in $LD_IDS;
        do
                LD_RAID=$(ssacli ctrl slot=$1 ld $LD_ID show | sed 's/ //g' | grep "FaultTolerance" | cut -f2 -d ":")
                JSON_LD=${JSON_LD}"{\"{#LD_ID}\":\"${LD_ID}\",\"{#LD_RAID}\":\"${LD_RAID}\"}"
        done

        echo "{\"data\":[$(echo ${JSON_LD} | sed -e 's/,$//')]}"
}


function DiscoveryPhDisk() {
        PH_IDS=$(ssacli ctrl slot=$1 pd all show detail | grep -i "physicaldrive" | awk '{print $2}')
        JSON_PH=''

        for PH_ID in $PH_IDS;
        do
                PH_MODEL=$(ssacli ctrl slot=$1 pd $PH_ID show detail | sed 's/ //g' | grep '^Model' | cut -f2 -d":")
                PH_SIZE=$(ssacli ctrl slot=$1 pd $PH_ID show detail | sed 's/ //g' | grep '^Size' | cut -f2 -d":")
                #PH_STATUS=$(ssacli ctrl slot=$1 pd $PH_ID show detail | sed 's/ //g' | grep '^Status' | cut -f2 -d":")

                JSON_PH=${JSON_PH}"{\"{#PH_ID}\":\"${PH_ID}\",\"{#PH_MODEL}\":\"${PH_MODEL}\", \"{#PH_SIZE}\":\"${PH_SIZE}\"},"
        done

        echo "{\"data\":[$(echo ${JSON_PH} | sed -e 's/,$//')]}"
}


function CtrlStatus() {
        CTRL_STATUS=$(ssacli ctrl slot=$1 show | sed 's/ //g' | grep -i "ControllerStatus" | cut -f2 -d":")

        if [[ $CTRL_STATUS == "OK" ]]; then
                echo 0
        else
                echo 1
        fi
}


function CtrlBatStatus() {
        CTRL_BAT_STATUS=$(ssacli ctrl slot=$1 show | sed 's/ //g' | grep -i "Battery/CapacitorStatus" | cut -f2 -d ":")

        if [[ $CTRL_BAT_STATUS == "OK" ]]; then
                echo 0
        else
                echo 1
        fi
}


function CtrlTemp() {
        ssacli ctrl slot=$1 show | sed 's/ //g' | grep -i "ControllerTemperature" | cut -f2 -d ":"
}


function LDStatus() {
        LD_STATUS=$(ssacli ctrl slot=$1 ld $2 show | sed 's/ //g' | grep "^Status" | cut -f2 -d ":")

        if [[ $LD_STATUS == "OK" ]]; then
                echo 0
        else
                echo 1
        fi
}


function PHStatus() {
        PH_STATUS=$(ssacli ctrl slot=$1 pd $2 show detail | sed 's/ //g' | grep '^Status' | cut -f2 -d":")

        if [[ $PH_STATUS == "OK" ]]; then
                echo 0
        else
                echo 1
        fi
}


function PHTemp() {
        ssacli ctrl slot=$1 pd $2 show detail | sed 's/ //g' | grep '^CurrentTemperature' | cut -f2 -d":"
}


function PHUsage() {
        ssacli ctrl slot=$1 pd $2 show detail | sed 's/ //g' | grep '^Usageremaining' | cut -f2 -d":" | sed 's/%//g'
}


case $ACTION in
        "DiscoveryCtrl")
                DiscoveryCtrl
        ;;

        "DiscoveryLogicalDisk")
                DiscoveryLogicalDisk $CTRL
        ;;

        "DiscoveryPhDisk")
                DiscoveryPhDisk $CTRL
        ;;

        "CtrlStatus")
                CtrlStatus $CTRL
        ;;

        "CtrlBatStatus")
                CtrlBatStatus $CTRL
        ;;

        "CtrlTemp")
                CtrlTemp $CTRL
        ;;

        "LDStatus")
                LDStatus $CTRL $OBJECT_ID
        ;;

        "PHStatus")
                PHStatus $CTRL $OBJECT_ID
        ;;

        "PHTemp")
                PHTemp $CTRL $OBJECT_ID
        ;;

        "PHUsage")
                PHUsage $CTRL $OBJECT_ID
        ;;
esac

В начале обьявляются переменные - ACTION, CTRL, OBJECT_ID, значения для этих переменных будут переданы из аргументов при запуске скрипта. Далее следуют основные функции,

  • DiscoveryCtrl - эта функция отображает в формате json данные по контроллеру - id, модель и серийник.
  • DiscoveryLogicalDisk - данная функция также в json отображает информацию со созданным логическим дискам.
  • DiscoveryPhDisk - с помошью этой функции дискаверим все физические диски.
  • CtrlStatus - функция для просмотра статуса по raid-контроллеру. И если статус OK, просто принтуется 0.
  • CtrlBatStatus - аналогичная прошлому примеру, функция возвращает статус батарейки контроллера.
  • CtrlTemp - при помощи этой функции мы сможем снимать данные по температуре контроллера.
  • LDStatus - функция, которая отображает статус логического диска.
  • PHStatus - аналогичная функция, которая показывает статус диска.
  • PHTemp - здесь мы уже смотрим температуру по конкретному диску
  • PHUsage - данная функция будет отображать в процентах значение о текущем уровне износа диска.

В конце скрипта следуют логический оператор case, от передаваемых агрументов к скрипту будет выбрана соответвующая по названию функция функция.

Пользовательские параметры Zabbix

Для последующей настройки требуется установить zabbix-агента на сервера. Процесс установки достаточно тривиальный, у меня агент уже инсталирован поэтому я просто скипку инструкции по его установки.

В каталоге /etc/zabbix/zabbix_agentd.d/ создаем файлик с параметрами для вызова скрипта:

root@prox01:~# vim /etc/zabbix/zabbix_agentd.d/userparams.conf
---
UserParameter=raid_ctrl[*],sudo /usr/local/bin/zbx_raid.sh $1 $2 $3

Для возможности привилигерованного запуска скрипта, добавим в sudoers правило для пользователя zabbix:

root@prox01:~# vi /etc/sudoers.d/zabbix
---
zabbix ALL=(ALL) NOPASSWD: /usr/local/bin/zbx_raid.sh

Дополнительно в конфиге агента, требуется увеличить timeout на исполнение.

root@prox01:~# vi /etc/zabbix/zabbix_agentd.conf
---
Timeout=30

После изменений, перезапускаем агента:

root@prox01:~# vi /etc/zabbix/zabbix_agentd.conf

Новый шаблон в Zabbix

Для создания нового шаблона переходим в web-панель zabbix, и проваливаемся в раздел Configuration/Templates. mon-disks-zbx1.png

Затем жмем на кнопку Create template для создания нового шаблона. mon-disks-zbx2.png

На новой странице указываем имя шаблона, группу и жмем на кнопку Create: mon-disks-zbx3.png

Теперь создадим правила для автообнаружения рейд контроллера и дисков. Внутри шаблона переходим в раздел - Discovery rules и жмем на кнопку создания нового правила: mon-disks-zbx4.png mon-disks-zbx5.png

В новом окне, указываем имя для нового правила и ключ. mon-disks-zbx6.png Обратите внимание, что в поле key указывается точно такой же ключ, что прописан в конфиге userparams.conf. В квадратных скобках заключен аргумент, который будет использован при запуске скрипта. В поле Update interval я указал интервал в 10 часов, нет необходимости в частом обнаружении контроллера. В завершении жмем на кнопку Add, и правило будет создано.

Следом, для этого правила создаем прототипы данных, кликаем на вкладку Item prototypes, и жмем на кнопку добавления нового правила: mon-disks-zbx7.png

Создадим прототип данных, который при обнаружении будет создавать объект для мониторинга состояния контролера. mon-disks-zbx8.png В поле name, будут подставлены значения из переменных #CTRL_MODEL и #CTRL_SERIAL. Значение ключа указываем ключ, с аргументами вызова нужной функции и нужного слота.

Добавляем еще один прототип, для мониторинга статуса батарейки контроллера. Либо можем клонировать раннее созданный прототип и изменить данные в нем, что бы повторно не заполнять все поля. mon-disks-zbx9.png

В заклонированном прототипе, меняем только поле name и key. mon-disks-zbx10.png

Последним прототипом для данного обнаружения будет айтем для мониторинга температуры контроллера.

Аналогично, клонируем предыдущий прототип и меняем имя, значение ключа: mon-disks-zbx11.png

Создаем автодискавери для мониторинга логических дисков. mon-disks-zbx12.png Задаем имя правила и в значении ключа используем в качестве агрумента название метода, и слот id контроллера.

Что касаемо мониторинга логического диска, мы создадим один прототип с помощью которого будем следить только за статусом диска. mon-disks-zbx13.png Имя для новых элементов данных будет собираться из id диска и уровня raid. В значении ключа передаем соответствующий метод и id контроллера и id диска.

Последнее правило требуется для обнаружения физических дисков. И оно будет таким: mon-disks-zbx14.png По аналогии, меняем только имя и аргументы в значении ключа.

Далее добавляем прототипы элементов данных. Для мониторинга статусов физ.дисков прототип будет такой: mon-disks-zbx15.png Опять же, меняем только имя и аргументы к ключу.

Создаем прототип для мониторинга температуры дисков: mon-disks-zbx16.png

И наконец, последний элемент для мониторинга использования диска: mon-disks-zbx17.png

На текущем этапе нам остается только добавить прототипы для триггеров и графиков, и можно будет считать шаблон рабочим. Что бы еще болee не утяжелять данный мануал, продемонстрирую создание объектов на одном правиле обнаружения.

Итак, проваливаемся в раздел Trigger prototypes, и добавляем новый объект: mon-disks-zbx18.png

Создадим прототип для тригера, который будет срабатывать на изменения статуса контроллера. mon-disks-zbx19.png Указываем имя для триггера, и в поле Problem expression вставляем выражение:

last(/Raid controller_HPE/raid_ctrl[CtrlStatus,{#CTRL_SLOT}])>0

В данном случаи тригер сработает, если последнее значение элемента данных по ключу raid_ctrl[CtrlStatus,{#CTRL_SLOT}] больше 0.

Значение для поля Recovery expression, содержит строку:

last(/Raid controller_HPE/raid_ctrl[CtrlStatus,{#CTRL_SLOT}])=0

То есть, если последнее значение по ключу raid_ctrl[CtrlStatus,{#CTRL_SLOT}] равно 0, то проблема закроется.

У меня список триггеров получился таким: mon-disks-zbx20.png

Думаю на этом все, весь материал я добавлю в гитхаб репу позже.

И надеюсь это будет полезно вам и вашим коллегам. =)