Теперь, когда у нас есть цель — «создать плагин Munin для удаленного контроля температур и напряжений на VMware ESXi хосте с использованием утилиты esxcli» и выбран инструмент для её достижения — Munin, можно смело приступать к созданию своего плагина мониторинга!
Постановка задачи
Итак, как мы уже знаем, нам нужно написать скрипт который бы считывал показания сенсоров с ESXi хоста, возвращал бы их значения и понимал бы параметр «config». То есть, при запуске наш скрипт должен:
1. Получать названия метрик и их значения посредством утилиты esxcli
2. Если задан ключ «config», то выводить параметры графика, названия и пороги для каждой метрики
3. Иначе просто возвращать текущее значение каждой метрики
Написать этот скрипт, как я уже упоминал ранее, можно на любом языке, лишь бы на компьютере с нодой Munin был бы соответствующий интерпретатор. Для разнообразия, давайте попробуем написать этот плагин, к примеру, на bash.
Немного о esxcli
Эта утилита позволяет получать и даже изменять множество параметров ESXi, в том числе и считать данные с SDR сервера. Синтаксис команды такой:
esxcli -s СЕРВЕР -u ПОЛЬЗОВАТЕЛЬ -p ПАРОЛЬ КОМАНДА , где
СЕРВЕР — это IP адрес или DNS имя сервера;
ПОЛЬЗОВАТЕЛЬ — имя пользователя;
ПАРОЛЬ — его пароль;
КОМАНДА — непосредственно команда которую мы хотим выполнить.
Нужно отметить, что указанный пользователь должен быть создан на 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, а посмотреть на результат работы плагина тут. Спасибо за внимание!