Zabbix: LLD-мониторинг дисков без UserParameter и скриптов на агентах

    В предыдущей статье я описал низкоуровневый мониторинг дисков для Windows-машин. Считаю, что статья получилась достаточно успешная. Поэтому пришло время ее фактически уничтожить. Ниже будет описан универсальный прием для Windows- и Linux-машин, для которых вообще не нужны скрипты и UserParameter'ы.

    Идея простая: все необходимое от smartmontools Zabbix-сервер будет получать через внешнюю обработку и zabbix_get, парсить и передавать далее в зависимые элементы (появились в Zabbix 3.4). Такие образом не только сокращается количество обращений к наблюдаемому серверу, но и не расходуются его ресурсы, так как парсинг происходит на стороне Zabbix-сервера.

    Одно ограничение на данный момент: мониторинг дисков только формата /dev/sd*. Формат /dev/csmi*,* (Intel Matrix RAID) не поддерживается ввиду того, что zabbix_get считает запятую вторым аргументом. Поправьте меня, если я ошибаюсь.

    Что понадобится для реализации:

    • Шаблон
    • Скрипт
    • zabbix_get на сервере
    • smartmontools на агентах

    Настройка агента


    Единственное, что заслуживает здесь внимания, это необходимость раскомментировать строку EnableRemoteCommands = 1, иначе агент не сможет принимать команды.

    Smartmontools


    Установка тривиальна и рассматриваться не будет, однако для Linux есть одна необходимость: для того, чтобы запуск проходил без sudo, необходимо установить бит SUID на файл smartctl. Для Ubuntu это — sudo chmod u+s /usr/sbin/smartctl.

    Скрипт


    В зависимости от вашего файла конфигурации zabbix_server.conf этот скрипт нужно положить в соответствующую директорию на Zabbix-сервер. По умолчанию для Ubuntu это — /usr/lib/zabbix/externalscripts. Не забывайте дать на файл права на выполнение — sudo chmod 775 /usr/lib/zabbix/externalscripts/smartctl.sh.

    smartctl.sh


    Шаблон


    Шаблон экспортирован из версии 3.4.4.
    В шаблоне уже присутствуют следующие элементы: модель, семейство, серийный номер, объем диска, статус SMART; а также значения SMART 3, 5, 7, 9, 10, 190(194), 196, 197, 198 ,199. Есть и 3 триггера: два оповещают о высоких температурах и еще один о плохом SMART'е.

    Hardware - HDD.xml


    Более подробно о том, как все устроено
    Ниже я постараюсь подробно описать что же происходит на каждом этапе.
    Первый этап: обнаружение доступных дисков sd* с помощью внешней проверки smartctl.sh с ключами {HOST.CONN} и discovery. В ответ сервер получает JSON с дисками, на которых активирована функция SMART. Диски без SMART'а или не sd* не выводятся.

    Этап второй: получение для каждого из найденных дисков двух элементов — Info и Attr. Info — информация о диске, Attr — атрибуты SMART. «Почему не запросить smartctl -a /dev/sd* ?» — спросите вы. Такой вывод получается не полный для части дисков, теряются атрибуты и так далее. Пришлось изобретать на ходу.

    Третий этап: Info и Attr разбираются на зависимые элементы с помощью предобработки регулярными выражениями. Это самая простая часть. Собственно, вам только останется подогнать под себя «регулярку».

    Итог


    Вот и все. Не нужно держать в голове что и куда положить, отключить ли политику выполнения скриптов PS, отслеживать ту же версию PS. А в случае необходимости все изменения производятся на самом Zabbix'е в веб-интерфейсе.

    В итоге хотелось бы просто сказать спасибо Алексею alexvl и его команде за качественный продукт, который не перестает радовать новым функционалом. Особенно за предобработку. Жизнь с ней администратору станет гораздо легче.
    Поделиться публикацией

    Похожие публикации

    Комментарии 18

      0
      Если так важно не захламлять АРМ пользователя, то достаточно использовать system.run.
      То есть, создаете один элемент с ключем system.run[«smartctl -A /dev/sda»] и несколько зависимых от него элементов с regex.
        0
        Это-то да, но как это вписывается в концепцию LLD? Как получить из system.run JSON?
          0
          А зачем Вам JSON? Есть же vfs.fs.discovery. Ключ в итоге будет иметь примерно такой вид:
          system.run[smartctl -A {#FSNAME}]
            0
            Вы этот метод сами пробовали? Для Windows тоже?
              0
              Пробовал, но отказался в пользу openhardwaremonitor.
              А так да, smartctl спокойно принимает буквы дисков как значение параметра:
              image.prntscr.com/image/3I0md9pOTkmpbUN9SN6b4A.jpeg
                0
                Ок, а как быть с разбитыми пополам дисками? Или с рейдами-стораджами?
                  0
                  Да, с дисками проблема, Zabbix пока-что не поддерживает LLD физических дисков.
                  Я RAID мониторю через IPMI\SNMP, т.к. ОС в случае ошибки может и не сообщить о ней.
                  0
                  Ок, я просто напишу почему это несостоятельно:
                  1) Если у диска более 1 раздела — задвоение
                  2) Рейд, сторадж спейсис, диск без поддержки СМАРТ — ошибочные элементы. Проверку-то вы не сделаете.
                    –1
                    1) Не страшно, получите 2 срабатывания триггера в случае чего. Опять же, тут скорее зависит от админов, мы уже давно не разбиваем диски.
                    2) Для серверов я вообще не использую агент, там только IPMI\SNMP.
          0
          Эх, как я не возился с этими /dev/csmi*,*, так нормального решения и не нашёл. Печально видеть, что воз и ныне там. Неужели так сложно сделать выбор сепаратора или реализовать экранирование?
            0
            Нормальное решение, мониторить через IPMI или SNMP.
            Ведь достаточно мониторить статус RAID, а не состояние дисков в нём.
              0
              А как же парк десктопов?
                0
                Выше ветка.
                  0
                  В десктопах тоже есть raid, будь они прокляты.
                  В общем, я наколупал эдакий прокси для запятых.
                  Чутка поправил smartctl.sh
                  #!/bin/bash
                  # 2017/12/07 AcidVenom v1.0
                  # Скрипт мониторинга HDD с LLD для Zabbix (серверный вариант)
                  
                  # Автообнаружение дисков
                  # Ключ: discovery
                  
                  IFS=$'\n'
                  JSON="{\"data\":["
                  SEP=""
                  
                  if [[ $2 = "discovery" ]]
                  then
                  get=`zabbix_get -s $1 -k system.run["C:\zabbix\scripts\smart.cmd --scan-open"]`
                  for hdd in $get
                  do
                  DISKID=`echo $hdd | grep "/dev/" | sed "s/\/dev\///" | awk '{print $1}'`
                          if [[ `zabbix_get -s $1 -k system.run["C:\zabbix\scripts\smart.cmd -i /dev/$DISKID"] | grep "SMART support is: Enabled"` != "" ]]
                          then
                          JSON=$JSON"$SEP{\"{#DISKID}\":\"$DISKID\"}"
                          SEP=", "
                          fi
                  done
                  JSON=$JSON"]}"
                  echo $JSON
                  
                  # Получение информации о дисках
                  # Ключи: info и attr
                  
                  else
                          if [[ $3 = "info" ]]
                          then
                          get=`zabbix_get -s $1 -k system.run["C:\zabbix\scripts\smart.cmd -x /dev/$2"]`
                          for out in $get
                          do
                          echo $out
                          done
                          elif [[ $3 = "attr" ]]
                          then
                          get=`zabbix_get -s $1 -k system.run["C:\zabbix\scripts\smart.cmd -A /dev/$2"]`
                          for out in $get
                          do
                          echo $out
                          done
                          fi
                  f
                  i

                  На агента кладём такой smart.cmd
                  @echo off
                  FOR /F "usebackq" %%a IN (`echo %2 ^| C:\zabbix\scripts\sed "s/\./,/"`) DO (
                  IF %%a NEQ ECHO (
                  set result=%%a
                  )
                  )
                  C:\zabbix\smartmontools\smartctl.exe %1 %result% | C:\zabbix\scripts\sed "s/\,/./"


                  Cmd использует сторонний sed, так как в батниках я не силён.
                  Буду очень рад, если кто-то причешет код.
            0
            Немного не в тему, но может кому-нибудь будет интересно. Небольше «я сделаль»:
            github.com/divanikus/salus

            Задумывалось как general purpose фреймворк, но для заббикса заточки тоже присутствуют.
              0
              Есть оооочень большая просьба перезалить шаблон! Очень уж любопытно посмотреть
                0
                Перезалито.

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

            Самое читаемое