Рубрики
Без рубрики

Munin. Часть 3. Плагин мониторинга ESXi.

Теперь, когда у нас есть цель — «создать плагин Munin для удаленного контроля температур и напряжений на VMware ESXi хосте с использованием утилиты esxcli» и выбран инструмент для её достижения — Munin, можно смело приступать к созданию своего плагина мониторинга!

Постановка задачи

Итак, как мы уже знаем, нам нужно написать скрипт который бы считывал показания сенсоров с ESXi хоста, возвращал бы их значения и понимал бы параметр «config». То есть, при запуске наш скрипт должен:

1. Получать названия метрик и их значения посредством утилиты esxcli
2. Если задан ключ «config», то выводить параметры графика, названия и пороги для каждой метрики
3. Иначе просто возвращать текущее значение каждой метрики

Написать этот скрипт, как я уже упоминал ранее, можно на любом языке, лишь бы на компьютере с нодой Munin был бы соответствующий интерпретатор. Для разнообразия, давайте попробуем написать этот плагин, к примеру, на bash.

Немного о esxcli

Эта утилита позволяет получать и даже изменять множество параметров ESXi, в том числе и считать данные с SDR сервера. Синтаксис команды такой:

esxcli -s СЕРВЕР -u ПОЛЬЗОВАТЕЛЬ -p ПАРОЛЬ КОМАНДА , где

СЕРВЕР — это IP адрес или DNS имя сервера;
ПОЛЬЗОВАТЕЛЬ — имя пользователя;
ПАРОЛЬ — его пароль;
КОМАНДА — непосредственно команда которую мы хотим выполнить.

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

И наконец команда считывающая данные SDR такая: hardware ipmi sdr list

Подробнее о esxcli можно прочитать в документации VMware vSphere.

Плагин. Передача переменных.

Когда сервер Munin связывается со своей нодой, он передает ей ряд параметров, которые при запуске плагинов будут установлены как переменные окружения. Этот механизм мы можем использовать для того, чтобы передавать нужные параметры в наш скрипт. Для этого, на компьютере с сервером, создадим в  /etc/munin/plugin-conf.d/ файл со следующим содержанием:

[esxcli_env_temp] # Имя плагина для которого будут установлены переменные
env.esxi_host 192.168.0.100
env.esxi_user munin
env.esxi_password letmein
env.warning :45 
env.critical :50

Теперь, в плагине «esxcli_env_temp» мы можем использовать, к примеру, переменную «warning» (её значение: «:45»). Думаю дальнейшие комментарии тут излишни.

Плагин. Получаем информацию.

Не забываем, что плагины у нас располагаются в каталоге /etc/munin/plugins/  на целевом компьютере, то есть там, где у нас установлена нода. Никакого отношения к серверной части Munin плагины не имеют!

Итак, получаем вывод команды esxcli:

data=`esxcli -s $esxi_host -u $esxi_user -p $esxi_password hardware ipmi sdr list`

Все теперь у нас в переменной data, содержится вывод этой команды. Он кстати имеет следующий вид:

Node-Sensor Description  Entity-Instance  Computed Reading  Base Unit  Raw Reading  Timestamp/Comment    Raw
----------- -----------  ---------------  ----------------  ---------  -----------  -------------------  ---
...
0.5         Proc Temp    3.1              N/A               degrees C  0            2001-03-21T02:41:57
...
0.9         Board Temp   7.1              40                degrees C  40           2001-03-21T02:41:57
...

Давайте считать, что все сенсоры температуры имеют в своем названии слово «Temp» и измеряются в «degrees». Теперь применяем немного магии bash и извлекаем из этой таблицы нужные данные…

OLDIFS=$IFS
IFS=$'\n'
sensor_names=(`echo "$data" | awk -v regexp="(temp.*degrees)" 'BEGIN{IGNORECASE=1;FS="\\\\s{2,}"} $0~regexp {gsub(" ","_",$2);print tolower($2)}'`)
sensor_labels=(`echo "$data" | awk -v regexp="(temp.*degrees)" 'BEGIN{IGNORECASE=1;FS="\\\\s{2,}"} $0~regexp {print $2}'`)
sensor_values=(`echo "$data" | awk -v regexp="(temp.*degrees)" 'BEGIN{IGNORECASE=1;FS="\\\\s{2,}"} $0~regexp {print $4}'`)
IFS=$OLDIFS

Получаем три массива:

sensor_names — с уникальными именами метрик для Munin (колонка Description и замена пробелов на подчеркивание);
sensor_labels — это названия метрик (колонка Description)
sensor_values — значения (колонка Raw Reading)

Плагин. Запуск с параметром «config»

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

echo "graph_title ESXi host temperatures"
echo "graph_vlabel С"
echo "graph_category sensors"
indexes=${!sensor_names[@]}
for index in $indexes; do
   echo ${sensor_names[$index]/./,}.label ${sensor_labels[$index]}
   echo ${sensor_names[$index]/./,}.warning $warning
   echo ${sensor_names[$index]/./,}.critical $critical
done

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

Плагин. Запуск без параметров.

Нам просто надо вернуть значения для всех метрик. Смотрим на пример выше и делаем:

for index in $indexes; do
   echo ${sensor_names[$index]/./,}.value ${sensor_values[$index]}
done

Ну вот и все!

Заключение.

Итак, соберем все части в один файл:

#!/bin/bash

data=`esxcli -s $esxi_host -u $esxi_user -p $esxi_password hardware ipmi sdr list`

OLDIFS=$IFS
IFS=$'\n'
sensor_names=(`echo "$data" | awk -v regexp="(temp.*degrees)" 'BEGIN{IGNORECASE=1;FS="\\\\s{2,}"} $0~regexp {gsub(" ","_",$2);print tolower($2)}'`)
sensor_labels=(`echo "$data" | awk -v regexp="(temp.*degrees)" 'BEGIN{IGNORECASE=1;FS="\\\\s{2,}"} $0~regexp {print $2}'`)
sensor_values=(`echo "$data" | awk -v regexp="(temp.*degrees)" 'BEGIN{IGNORECASE=1;FS="\\\\s{2,}"} $0~regexp {print $4}'`)
IFS=$OLDIFS

indexes=${!sensor_names[@]}
case $1 in # Проверяем параметр
    config) # Если параметр "config"
        for index in $indexes; do
            echo "graph_title ESXi host temperatures"
            echo "graph_vlabel С"
            echo "graph_category sensors"
            echo ${sensor_names[$index]/./,}.label ${sensor_labels[$index]}
            echo ${sensor_names[$index]/./,}.warning $warning
            echo ${sensor_names[$index]/./,}.critical $critical
        done
        exit 0;;
    *) # Если параметр не "config"
        for index in $indexes; do
            echo ${sensor_names[$index]/./,}.value ${sensor_values[$index]}
        done
        exit 0;;
esac

Полный текст плагина, вместе с напряжениями, Вы можете найти в репозитроии Munun contrib на GitHub, а посмотреть на результат работы плагина тут. Спасибо за внимание!

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *