Zabbix: LLD-мониторинг железа под Windows на PowerShell

    Changelog

    Пришло время и мне собрать свой велосипед для мониторинга физического состояния Windows-железок. Готового решения или хоть более или менее работающего найти не удавалось с момента моего знакомства с Zabbix, а это более 3 лет. А тем более, чтобы оно было… элегантно что ли. Лично мне даже в таких вещах хочется видеть стройность и максимальную функциональность. Именно поэтому далее рассматривается только LLD и PowerShell. Ну и конечно же только бесплатное ПО.

    Итак, мониторинг чего будет производиться:

    • S.M.A.R.T. дисков (информация, общее состояние и отдельные показатели)
    • Температуры, напряжение, обороты кулеров (на ваш выбор)

    А выглядеть это все будет примерно так:



    Суммарно понадобятся:

    1. smartmontools
    2. OpenHardwareMonitor
    3. NSSM
    4. 2 скрипта на PS, приведенные ниже
    5. шаблон

    Шаблон


    Под спойлером находится актуальный шаблон. Просто сохраните содержимое в формате xml и импортируйте в свой Zabbix.

    Шаблон


    Шаблон создан в Zabbix версии 3.2, возможно, будет работать и в более ранних версиях. Ключи стандартны и имеют вид ZScript[имя_скрипта, параметр1,.., параметрN]. Параметры передаются непосредственно в сам скрипт.

    Надеюсь, шаблон получился максимально простым и понятным.

    Скрипты PS


    Ниже приведены необходимые скрипты. Внутри уже находятся и обнаружение, и запрос отдельных элементов. Работа проверена на Windows от XP SP3 до 2016. Само собой, решение с Execution Policy остается за вами.

    windows.hdd.ps1 -> Для smartmontools


    Обнаруживаются только диски с задействованным СМАРТом. Параметры запрашиваются из столбца «RAW_VALUE». Хотите мониторить другой параметр? Просто укажите его номер. По умолчанию скобки и их содержимое отбрасываются. Если нужный вам параметр диск не отдает, то возвращается пустое поле.

    windows.hard.ps1 -> для OHM


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

    Также зарезервировано одно имя датчика — Vbat. Это напряжение аккумулятора БИОС. Его значение вынесено в отдельный элемент для триггера (срабатывает если менее 2,9V).

    Значения температур и оборотов кулеров на выходе целочисленные, значения напряжений передаются как есть.

    Теоретически, можно обнаруживать и другие показатели (нагрузки, частоты,..). Используйте для этого соответствующий второй параметр в ключе. К примеру: ZScript[hard,discovery,load].

    Подготовка Zabbix-агента


    Для максимальной унификации я использую следующий и единственный параметр для своих скриптов:

    UserParameter=ZScript[*],powershell C:\System\Zabbix\Scripts\windows.$1.ps1 "$2" "$3"

    Это дает максимальную гибкость и однообразность. Если нужно будет добавить еще параметров для каких-либо скриптов, можно просто добавить переменных в кавычках. На текущие работающие скрипты это никак не повлияет. Префикс windows я использую на всякий случай, мне так удобно хранить шаблоны для гарантированной идентификации.

    smartmontools


    Для мониторинга состояния дисков используется smartmontools (версия 6.5 на момент написания статьи). При установке ПО по умолчанию ставится утилита smartctl-nc — именно она используется в скрипте для облегчения жизни вашего сервера. Также потребуется прописать пусть к папке bin в переменных средах.



    Путь просто добавляем в конец переменной Path через точку с запятой. По умолчанию — C:\Program Files\smartmontools\bin



    OpenHardwareMonitor


    Для датчиков же используется OHM. Софт бесплатный с открытым кодом. Установка тривиальна, но для полноценной работы необходимо запускать программу в качестве службы. Для подобных вещей есть NSSM, я бы все же советовал качать последнюю сборку. А здесь можно посмотреть синтаксис.
    Обещанный выбор датчиков обеспечивается за счет того, что названия датчиков можно изменять! Изменяете имена на удобочитаемые (они будут использованы в именах элементов), а ненужные датчики комментируете #.

    Не забывайте перезапустить программу/службу для применения переименования.



    Итого


    В итоге получился неплохой инструмент для мониторинга. Желающие могут навесить свои триггеры на нужные прототипы элементов. Или же полностью переработать шаблон.

    2017/07/05 ОБНОВЛЕНИЕ: исправлена ошибка в windows.hdd.ps1 — теперь в JSON не появляется запятая в начале.
    Поделиться публикацией

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

      +2
      При должном отклике могу опубликовать LLD-шаблон для служб лицензирования FlexLM под Windows.
      0
      Спасибо. Весьма полезная статья.
        0
        Как раз вовремя статья, в марте будет стоять такая задачка. Спасибо!
          0
          write-host -NoNewline "{"
          write-host -NoNewline "`«data`»:["

          write-host -NoNewline "]"
          write-host -NoNewline "}"

          Что-бы не городить подобные велосипеды в Powershell есть функция Convertto-Json

            0
            Спасибо!
            0
            Есть еще вариант.
            Первый, гораздо реже, создает готовый LDD который отдается обычным Write-host, не так уж часто оборудование меняется.
            Второй скрипт создает форматированный файл по всем интересующим устройствам раз в N минут.
            А в шаблоне при обнаружении формируются итемы с конкретными ИД устройств которые забираются третьим простейшим скриптом из готового файла.

            Итог: дергает smartctl(что-то другое) один раз, детали постоянно берем из простого файла, тем самым снижаем паразитную нагрузку на железо, файл влезает в дисковый кеш и не нагружает систему.
            Как показывает практика раз в 10 минут готовить файл с интересующими параметрами достаточно что бы отреагировать на проблему, в большинстве случаев вы её всё равно будете дольше решать ;)

            Скрипты подготовки вы так же вызываете как item с контролем кода и настраиваете триггер.
            Они выкидывают цифровое значение:
            0 — всё в норме
            <>0 — ваши ошибки для поиска проблемы почему не работает скрипт
              0
              Насчет нагрузки: для 3-5 дисков нагрузки ноль или около ноль на очень-очень старом «железе», на последнем скрине видно на каком.
              0
              Автокадный FlexLM — да, очень даже интересно помониторить.
                0
                Получается примерно так. Серверы и фичи обнаруживаются сами. Один момент: для читаемости нужно прописать макросы.
                Flex

                  0
                  Брр. Так и не понял — исходные данные от Flex-то каким образом берутся?
                    0
                    Точно так же: 1 скрипт на сервер, на котором есть флекс-службы, и lmutil.exe, который содержится в дистрибутивах от Автодеска, Нанософта, Сисофта и т.д.
                      0
                      а, точно. про lmutil-то я как раз и не вспомнил :(
                  0
                  0
                  Импортировать шаблон в Zabbix 3.2 не удалось — вываливался с ошибкой.
                    0
                    Заменил на ссылку. Хабр парсит некоторые символы, а заббикс их читать не умеет.
                    0
                    С мониторингом диска более-менее понятно, с оборудованием сложнее — выдает

                    Received value [] is not suitable for value type [Numeric (unsigned)] and data type [Decimal]

                    OHM запущен как служба, в Discovery ошибок нет, но мониторить не получается — что и где надо переименовать?
                    Timeout в конфигурации агента Zabbix установлен на максимум — 30 секунд.
                      0
                      Такое случается, когда скрипт отдает ошибку. Попробуйте для начала посмотреть отработку скрипта в ручном режиме. Для этого можно запустить через PowerShell ISE или просто из командной строки с заданными параметрами. Если все хорошо отрабатывается, то переходите к zabbix_get на стороне Zabbix-сервера.
                      Кстати, вроде бы у кого-то уже возникала подобная проблема. В том случае был запущен zabbix-агент не как служба.
                      Если возникнут проблемы, отпишитесь мне в почту, адрес есть в профиле.
                      +1
                      Глянул шаблон, и меня очень смутило вот это выражение
                      {Hardware — Windows:ZScript[hdd,{#DISKID},status].regexp(^PASSED$)}=0
                      У диска с плохим смартом статус тоже будет PASSED. Ведь так? Как вы тогда будете отсеивать диски с плохим смартом?
                        0
                        Все верно, должна быть 1. Спасибо за замечание.
                        У себя-то поправил, а в общественном шаблоне забыл.
                        У диска с хорошим смартом сработает триггер если =0.
                          0
                          Подождите, я правильно понял триггер? Вы проверяете, прошел ли диск проверку смартом, верно?
                            0
                            Верно. Если найден «PASSED», то все ОК. Иначе сработать триггер.
                              0
                              Тогда ваш триггер некорректный. Так как винчестер с плохим смартом так же пройдет проверку и в забиксе статус будет «PASSED».
                                0
                                Триггер не берет значение из smartctl, он сравнивает значение элемента с «PASSED». Если значение элемента меняется на «FAILED», то триггер срабатывает.
                                За «выдирание» статуса отвечает скрипт. Так что все корректно.
                                  0
                                  Вы проверяли его на конкретно на плохом винчестере? FAILED будет, если он вообще смарта не сможет проверить.
                                    0
                                    Да, месяц назад как раз поймал такой винт.
                                    И это не страшно. Куда страшнее плохой сектор в служебной области. Вот тогда девственно чистый смарт и вытекающие.

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

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