Глава 14. Мониторинг устройств IPMI

На данный момент мы знакомы с мониторингом при помощи агентов Zabbix, SNMP и различных прочих методов. В то время как SNMP очень популярен и доступен для подключаемых через сеть устройств, существует и другой протокол, который имеет целью системное управление и мониторинг: IPMI (ntelligent Platform Management Interface). IPMI обычно реализуется как обособленный модуль управления и мониторинга, причём не зависит от имеющейся в хосте операционной системе, который также способен предоставлять информацию когда его машина выключена. IPMI становится всё более и более популярным и Zabbix имеет прямую поддержку IPMI. IPMI в особенности популярен в так называемых отключённых (lights-out) или вне полосными (out-of-band) платами управления, в наши дни доступными в большинстве серверного оборудования. Тем самым, может оказаться желательным отслеживать значение состояния напрямую с этих плат, так как это не зависит ни от имеющегося типа операционной системы, ни даже от того запущена ли она вообще.

В этой главе мы рассмотрим такие темы:

  • Получение устройства IPMI

  • Подготовка к мониторингу IPMI

  • Установка элементов IPMI

  • Мониторинг дискретных датчиков

Получение устройства IPMI

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

Подготовка к мониторингу IPMI

Для получения данных с помощью IPMI Zabbix должен быть настроен надлежащим образом, а само устройство обязано применять подключения со стороны Zabbix. Если вы установили Zabbix из пакетов, поддержка IPMI должна быть доступна. Если же вы компилировали Zabbix из исходного кода, также следует включить и поддержку библиотеки OpenIPMI. Чтобы убедиться в наличии, проверьте сообщения при запуске в файле регистрации своего сервера. Убедитесь что имеющаяся для IPMI строка сообщает YES:


IPMI monitoring:              YES
 	   

Этого всё ещё не достаточно - по умолчанию сервер Zabbix настроен на то чтобы не запускать никакие опросы IPMI; тем самым, никакие добавляемые IPMI не будут работать. Для изменения этого откройте zabbix_server.conf и отыщите такую строку:


# StartIPMIPollers=0
 	   

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


StartIPMIPollers=3
 	   

Сохраните этот файл и перезапустите zabbix_server.

На стороне отслеживаемого устройства добавьте пользователя, которого может применять Zabbix. Сам стандарт IPMI определяет различные уровни привилегий, причём для целей мониторинга наиболее подходящим уровнем может быть уровень пользователя. Такая настройка пользователей IPMI может быть выполнена при помощи инструментов командной строки, веб интерфейса или иных методов, предоставляемых производителем. На данном этапе за дополнительными сведениями обратитесь к конкретной документации производителя.

Настройка элементов IPMI

Прежде чем мы сможем добавлять в Zabbix элементы IPMI, нам следует проверить доступ к IPMI. По умолчанию IPMI применяет порт UDP 623, а потому убедитесь что он не блокируется каким бы то ни было межсетевым экраном. Проверьте что ваш сервер Zabbix имеет установленным пакет ipmitool - если это не так, выполните следующее:


$ ipmitool -U zabbix -H  -I lanplus -L user sdr
Password:
		

Предоставьте тот пароль, который вы настроили для данной конфигурации IPMI. Мы применяем уровень доступа пользователя, который задаётся значением флага -L user, потому что полномочия администратора не должны требоваться для имеющегося пользователя Zabbix. Значение флага I lanplus указывает ipmitool на необходимость использования интерфейса локальной сетевой среды IPMI v2/0, а команда sensor опрашивает сам хост на предмет доступных датчиков. Если ваше устройство имеет IPMI запущенным не с устанавливаемым по умолчанию портом, вы можете определить значение порта при помощи флага -p.

[Замечание]Замечание

Zabbix не применяет ipmitool для опроса устройств IPMI; вместо этого он использует библиотеку OpenIPMI. Эта библиотека исторически имеет ряз ошибок и работа экземпляра ipmitool не гарантирует того что IPMI мониторинг будет рабоать с сервером Zabbix. Если вы сомневаетесь, выполните проверку с самой последней версией OpenIPMI.

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


BB +5.0V         | 4.97 Volts        | ok 
Baseboard Temp   | 23 degrees C      | ok 
System Fan 2     | 3267 RPM          | ok 
Power Unit Stat  | 0x00              | ok
		

Это выглядит как полезные данные, поэтому давайте попытаемся отслеживать RPM вентилятора в Zabbix. В имеющемся интерфейсе выполните следующее:

  1. Перейдите в Configuration | Hosts. Чтобы оставлять вещи упорядоченными, давайте создадим некий новый хост для своего мониторинга IPMI - кликните по Create host, а затем введите следующие значения:

    • Name: IPMI host.

    • Groups: Кликните по Select и выберите Linux servers, либо наберите его в блоке Groups и выберите необходимую группу, когда она будет отображена.

    • IPMI interfaces: Кликните по управлению Add и введите , а затем кликните по Remove следующий за Agent interfaces.

    [Совет]Совет

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

  2. Переключитесь в закладку IPMI и введите такие значения:

    • IPMI username: Введите имя пользователя, применяемое для доступа к IPMI

    • IPMI password: Введите значение пароля, применяемое для доступа к IPMI

      Если вы установили длинный пароль, вы обнаружите некую ошибку о том что значение максимума для допустимого поля пароля составляет 20 символов, что показано на снимке экрана ниже. Это нормально, так как значение длины максимального пароля для IPMI v2.0 составляет 20 символов.

       

      Рисунок 14-1



  3. Если у вас имеются различный конфигурации для Zabbix, такие как различные уровни привилегии или порты, настраивайте их надлежащим образом. По окончанию кликните по имеющейся в самом низу кнопке Add.

    Для данного хоста мы повторно применяем свою группу Linux servers - будьте вольны добавить его в некую обособленную группу.

Создание элемента IPMI

Теперь, когда мы разобрались с необходимой частью подключения IPMI, настало время создаия реальных элементов. Убедитесь что в ниспадающем меню Group выбраны Linux servers, затем кликните по Itemsидущими вслед за IPMI host, а заетм кликните по Create item. Введите такие значения:

  • Name: System Fan 2 (или, когда ваше устройство с IPMI е предоставляет такого датчика, выберите иной полезный датчик)

  • Type: IPMI agent

  • Key: System_Fan_2

  • IPMI sensor: System_Fan_2

  • Units: !RPM

По окончанию кликните по кнопке Add в самом низу.

[Совет]Совет

Несмотря на то, что предыдущий чёрный список единиц в Zabbix по-прежнему работает, теперь он устарел. Следовательно, правильный способ предотвратить преобразование этих единиц сейчас состоит в !ms, !rpm, !RPM, !%.

Для данного типа элемента в качестве некого идентификатора элемента применятся только ключ item, а мы можем ввести здесь любую строку. У нас имеется возможность применять имеющееся название датчика с пробелами, заменёнными на подчёркивания для более простого указания такого элемента в выражениях триггера и в прочих местах. Установленное название датчика IPMI будет определять какие данные будут собираться.

В некоторых устройствах их название датчика может иметь завершающими символами пробелы. Это не является очевидным из получаемого по умолчанию вывода датчика в ipmitool. Когда вам кажется что название датчика верное, но его запросы из Zabbix оканчиваются неудачей, попробуйте заполучить данные для отдельного датчика из своего сервера Zabbix:


$ ipmitool -U zabbix -H &l
t;IP address of the IPMI host> -I lanplus -L user sensor get "System Fan 2"
		

Это выведет на печать подробные сведения для такого датчика. В случае отказа заданное название датчика вероятно не верное.

Давайте проверим результаты своей работы; откройте Monitoring | Latest data, а затем выберите в его фильтре IPMI host:

 

Рисунок 14-2



Обратите внимание на то, что получаемое значение отображается полностью и не сокращается до 3.3K. Единица !RPM по- прежнему включён в список жёстко кодируемых элементов, а потому применяющие такие единицы элементы не имеют добавляемого префикса множителя единиц и лучше применять значение !, поскольку оно является новым способом помещения в чёрный список, плюс к тому, что добавляет нам больше гибкости. Мы более подробно обсудим имеющийся чёрный список единиц в Главе 20, Сопровождение Zabbix.

Отлично! Необходимая информация состояния оборудования выбирается как положено. Что ещё лучше, эта информация получается независимо от установленной операционной системы или особых агентов и она получается даже когда нет запущенной операционной системы вовсе, или даже когда она не установлена.

[Замечание]Замечание

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

Мониторинг дискретных датчиков

Перечень датчиков отображает ряд датчиков у которых значения достаточно понятны, например, температура и RPM вентиляторов. Хотя некоторые из них могут быть несколько более сложными. Например, ваш список датчиков может иметь некий датчик с названием Power Unit Stat или нечто аналогичное. Это дискретные датчики. Вы можете считать что они возвращают 0 для некого состояния OK и 1 для Failure, однако обычно они более сложные чем приводимое. К примеру, датчик элемента питания на самом деле может возвращать сведения о восьми различных состояниях в одном получаемом значении.

Давайте попробуем отслеживать их и посмотрим какие значения мы можем получать в Zabbix для такой системы:

  • Переместитесь к Configuration | Hosts, кликните по Items за IPMI host, а затем кликните по Create item. Заполните следующее:

    • Name: Power Unit Stat (или, когда ваше устройство с возможностями IPMI не предоставляет такого датчика, выберите иной полезный датчик)

    • Type: IPMI agent

    • Key: Power_Unit_Stat

    • IPMI sensor: Power Unit Stat

  • По завершению кликните по кнопке Add в самом низу.

  • [Замечание]Замечание

    Если обычные датчики работают, а дискретные нет, убедитесь что вы выполняете свои пробы с самой последней версией библиотеки OpenIPMI. Дискретные датчики в OpenIPMI-2.0.16, 2.0.17 и 2.0.18 часто имеют некий дополнительный 0 (или какую- то иную цифру или букву), добавляемый в конец.

Кликните по этому элементу в разделе Latest data - это скорее всего вернёт 0. Но что он способен возвращать?. На самом деле это десятичное представление какого- то двоичного значения, в котором каждый бит может отображать некое определённое состояние, причём наиболее часто это отказ. Для данного датчика все возможные состояния перечисляются в Intelligent Platform Management Interface Specification Second Generation v2.0.

[Совет]Совет

Самую последнюю версию этой спецификации можно найти на http://www.intel.com/content/www/us/en/servers/ipmi/ipmi-home.html.

Согласно этой спецификации установленный соответствующие индивидуальые шестнадцатеричные значения таковы:

Таблица 14-1. Значения датчика Power Unit Stat
Номер бита Описание

00h

Отключение питания/ Выключение питания

01h

Полный цикл отключения/ включения питания

02h

Отключение питания 240 ВА

03h

Блокировка отключения питания

04h

Утрата переменного питания/ потеря входной мощности (пропал источник энергии для блока питания)

05h

Отказ программного управления питанием (данное устройство не ответили на запрос включения)

06h

Выявлен отказ блока питания

07h

Предсказуемый сбой

Просмотр описания первого бита, значения 0, подразумевает что устройство работает и не сообщает о проблемах. Двоичное значение 1 означает что устройство отключено. Мы могли бы сравнивать получаемое значение с 0 и это сообщало бы нам что с этим устройством всё отлично, но что если вы пожелаете проверить прочие биты, например, предсказанного отказа? Если бы был установлен только этот бит, данный элемент возвращал бы 128. Как уже упоминалось ранее, дискретные элементы возвращают некое десятичное представление имеющегося двоичного значения. Изначальным значением является 10000000 (или 07h в предыдущей таблице), где установлено значение восьмого бита, исчисляемого с самого последнего значимого. Кстати, по этой причине мы также оставили для данного элемента поле Type of information в виде Numeric (unsigned), а Data type как Decimal - хотя действительное значение кодируется двоичным представлением, причём само значение передаётся в виде некого десятичного целого.

Таким образом,для проверки предсказанного отказа мы можем сравнить полученное значение со 128, не так ли? Нет, не совсем. Если данная система выключена и сообщает предсказанное значение, его первоначальным двоичным значением может быть 128 10000001, а в десятичном представлении как 129. Ещё больший беспорядок начинается когда мы начинаем здесь включать прочие биты. Именно по этой причине невозможно применять на этот раз соответствие значения для таких элементов - в некоторых ситуациях какое- то значение может означать что установлены все биты и для каждой возможной комбинации должна иметься запись сопоставления значения. Да, и мы не можем просто проверять что система отключена просто сверяясь со значением 1 - значение 129 и целый ряд иных значений также может означать это.

Раз мы не можем сопоставлять самое последнее значение неким простым образом, можем ли мы вообще разумным образом проверять такие дискретные значения? К счастью да; Zabbix предоставляет функцию побитового триггера, именуемую как band(), которая изначально была реализована специально для мониторинга десятичного датчика.

Применение побитовых функций триггера

Такая специальная функция band() является чем- то аналогичным самой простой функции last(), однако вместо того чтобы просто возвращать самый последний значащий бит, она применяет некую битовую маску и побитовый AND к полученному значению и возвращает получаемый результат такой операции. Если мы желаем проверить самый последний значащий бит, то что позволит нам узнать включено ли наше устройство, так это применение маски битов 1. Предположим что также установлены и прочие биты и мы могли бы получить от наблюдаемой системы значение 170. В двоичном виде это было бы 10101010. Побитовое AND умножало бы все биты вниз как это показано в соответствующей колонке:

Таблица 14-2. Побитовое AND с установленной маской
  Десятичное значение Двоичное значение

Значение

170

10101010

Побитовое AND (помножаемое вниз)

 

 

Маска

1

00000001

Результат

0

00000000

Для функции переключателя band() установлен следующий синтаксис:


band(#number|seconds,mask)
 	   
[Замечание]Замечание

Она также имеет третий параметр, time shift - мы уже обсуждали сдвиг по времени в Главе 6, Выявление проблем при помощи триггеров.

Когда мы представляем себе двоичное представление, нам приходится применять в Zabbix десятичные числа. В данном случае это просто - значение выражения переключателя будет таким:


{host:item.band(#1,1)}=1
 	   

Мы проверяем самое последнее битовое значение, полученное с #1, применяем десятичную маску 1, и проверяем установлен ли самый последний бит.

В качестве более сложного примера, давайте допустим что мы желаем проверить другие биты (начиная с самых последних значащих) 3 и 5 и мы получим значение 110 (в десятичном представлении):

Таблица 14-3. Побитовое AND с установленной маской
  Десятичное значение Двоичное значение

Значение

110

01101110

Побитовое AND (помножаемое вниз)

 

 

Маска

20

00010100

Результат

4

00000000

Простым способом представления операции с усатновленной маской было бы что все биты, которые соответствуют в маске 0, устанавливаются в 0, а все прочие передаются как есть. В данном случае мы интересуемся установкой двух битов, 3 и 5, а потому выражеие будет таким:


{host:item.band(#1,20)}=20
 	   

В нашем значении был установлен лишь бит 3 и получаемым значением будет 4, что не соответствует 20 - ни один бит не установлен, а потому выражение триггера вычисляется как FALSE. Если бы мы хотели установлен ли бит 3 и при этом сброшен бит 5, мы бы сравнивали получаемый результат с 4, А если вы желаете проверить что бит 3 сброшен, а бит 5 установлен, мы бы выполняли сравнение с 16 - так как в двоичном виде это 00010000.

Теперь давайте вернёмся к проверки установки для значения бита предсказания - это был восьмой бит, а потому нашей маской должна быть 10000000 и нам следует проводить сравнение с 10000000. Однако они оба должны быть представлены в десятичном формате, а потому нам следует установить и значение маски, и значение сравниваемого значения в 128.

Давайте вооружившись этим знанием создадим в имеющемся интерфейсе триггер:

  1. Перейдите к Configuration | Hosts, после IPMI host кликните по Triggers, а затем кликните по Create trigger/

  2. В поле Name введите Power unit predictive failure on {HOST.NAME}, а затем кликните по Add сразу после Expression.

  3. После поля Item кликните по Select, а затем выберите Power Unit Stat.

  4. Установите в ниспадающем меню Function установите Bitwise AND of last (most recent) T value and mask = N, в ведите 128 и в поле Mask, и в поле N, а затем кликните по Insert. Результирующим выражением триггера должно быть следующее:

    
    {IPMI host:Power_Unit_Stat.band(,128)}=128
     	   

Вы заметили что самый первый параметр опущен? Как и в случае с функцией last(), пропуск параметра эквивалентен установке в #1, как и в предыдущих примерах. Это выражение триггера будет игнорировать самые последние 7 значащих бити проверит установлен ли результат в двоичное 10000000 или десятичное 128.

Побитовое сравнение также допустимо и для функции count(). В данном случае имеющийся синтаксис слегка более сбивает с толку: и сам параметр и маска должны определяться во втором параметре, разделяемые слэшем. Если заданные шаблон и маска эквивалентны, значние маски может быть опущено. Для прояснения этого давайте попробуем рассмотреть некоторые примеры.

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


count(10m,128,band)
 	   

Наши шаблон и маска были теми же самыми, а потому мы можем опустить часть маски. Наше предыдущее выражение эквивалентно такому:


count(10m,128/128,band)
 	   

Если бы мы пожелали вычислить сколько значений имеют установленным 5 бит при не взведённом 3 бите в течении последних 10 минут, выражение в части функции обязано выглядеть следующим образом:


count(10,16/20,band)
 	   

Здесь значением шаблона является 16 или 10000, а маска 20 или 10100.

Остерегайтесь добавлить слишком много элементов IPMI в отдельную систему - очень просто перегрузить контроллер IPMI.

[Совет]Совет

В выпуске Zabbix 4.0 теперь в поле датчика IPMI можно применять id: и name: -

  • name: позволяет нам определять сам датчик по его полному названию вместо его короткого названия

  • id: даёт нам величины параметра для определения значения конкретного датчика, который мы намерены отслеживать

Все эти сведения запросто можно обнаружить в файле журнала Zabbix. Для этого лучше будет запустить сервер Zabbix с уровнем отладки 4.

Выводы

Хотя он и не настолько широко распространён как SNMP, IPMI может предоставлять независимый от программного обеспечения мониторинг оборудования для определённых устройств, как правило серыеров. Он становится всё более и более популярным в качестве решения внеполосного мониторинга и управления, которое способно помочь нам с отслеживанием аппаратных средств для совместимых устройств.

Zabbix поддерживает отслеживание обычных датиков, например, напряжения, RPM и температуры, а также дискретных датчиков, которые имеют возможность упаковывать много сведений в единственном целом значении. Для дешифрации той информации, клторая скрыта в этом целом, Zabbix предлагает специальную функцию триггера с названием band(), которая делает возможным побитовое маскирование и установление соответствие особым битам.

Рассмотренный в этой главе IPMI проявляется на самом нижнем уровне системного стека. В нашей следующей главе мы обсудим способы отслеживания приложений Java при помощи протокола JMX. Zabbix поддерживает JMX через выделенные процессы с названием шлюза Java Zabbix, который мы и настроим.

Вопросы

  1. Что я должен заполнить в поле датчика IPMI в своём элементе?

  2. Могу ли я прмиенять LLD для выявления своих элементов IPMI?

Дальнейшее чтение

Для получения дополнительных сведений ознакомьтесь со следующей статьёй: IPMI checks.