Jump to content
iT4iT.CLUB
Kitsum

Мониторинг триггеров в GUI под Windows

Recommended Posts

Описанный ниже велосипед является продолжением одной из моих статей на другом, интересном мне, ресурсе. Продолжение и все последующие обновления будут происходить только на it4it.club

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

Цитата

Доброе время суток.

Прежде чем вдаваться в описание программы, укажу на ситуацию которая привела к созданию очередного велосипеда.
Есть группа в которую входит Ваш покорный слуга + два сотрудника. В наше присутствие на рабочем месте, события в Zabbix (2.2) отслеживаются постоянно, а если быть точным то 8 часов в день, 5 дней в неделю. Исключения составляют праздничные дни и отпуска совпавшие с изменениями графика работы у коллег.
В наше отсутствие мониторингом инфраструктуры занимается (по крайней мере должен заниматься) дежурный персонал. В этом и кроется проблема!
Как выясняется, люди работающие в режиме день - ночь - 48 часов дома, не проявляют особого интереса к мониторингу состояния триггеров со всеми вытекающими из этого последствиями. Ну да Бог с ними, воспитательные работы - задача административного персонала.

Наша задача более явно оповещать об изменениях в активных триггерах на машинах дежурного персонала под управлением ОС Windows.
Под этим я подразумеваю:
1. Оповещать о переходе активного триггера в состояние TRUE
    - Звуковым сигналом
    - Всплывающей подсказкой в трее
2. Возможность видеть проблемные триггеры в GUI Windows

Велосипед заключается в том, что мы будем использовать PHP для реализации GUI под Windows. Да, да, да ... можете плевать в мою сторону и я полностью согласен, что C++ намного эффективнее, но мои познаний в C++ еще не достаточно, для перехода на новую ступень эволюции.

...

Скрытый текст

P3.thumb.png.e1315a4c50d0c1d70dcf3765924

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

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

Общее окно программы переработано и теперь отображает список всех групп из Zabbix с их хостами. Список активных триггеров переехал в нижнюю часть окна и отображает дополнительную информацию об узлах с которыми не все гладко. Сам список можно увеличивать, если все совсем плохо, или уменьшать если выражение "Хьюстон у нас проблемы" Вы слышите только в фильмах. Также появились цветные маркеры важности триггера. По двойному клику по активному триггеру мы перемещаемся в соответствующую группу где находится проблемный узел.

Скрытый текст

zti1.thumb.jpg.ff0c49f828126174700bc02ba

Скрытый текст

zti4.thumb.jpg.ca907061b917487d97f148b81 

Не забыли и про то, ради чего вся начальная песня и писалась - трей с всплывающими оповещениями и звуковым сигналом. Основное окно сворачивается именно туда, чтобы не залеживаться на панели где ценится каждый свободный пиксель.

Скрытый текст

zti3.thumb.jpg.6776f05f6810f4e06bcf670c8

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

  1. Telnet
  2. SSH
  3. RDP
  4. VNC

Проверка соединения:

  1. Ping
  2. Traceroute

Естественно его можно расширить, добавив всяких вкусностей по мере возрастания аппетита IT отдела.

Скрытый текст

zti6.thumb.jpg.4f1cfbad5c1de63aba0c558e9

Скрытый текст

zti5.thumb.jpg.d4e3e2d144d813b9959ba4dfe 

Программа по прежнему имеет серверную и клиентскую часть, что позволило организовать кэширование запросов и осуществлять оповещения в момент определения проблемы сервером, а не по таймеру обновления, как это организовано в dashboard zabbix. Раньше узнали о проблеме, раньше приступили к устранению. Естественно и устаревшие триггеры убираются также оперативно.
Также это позволило избавить программу от информации о доступе к серверу, что мне кажется не приемлемым для оповещалки. Чем меньше дырок, тем крепче сон.

Приступим к реализации.

Ну и естественно, Ваш покорный слуга еще не научился писать на C++ ничего более сложного чем "Hello World", поэтому клиент и сервер будет написан на PHP. За исключением того момента, что клиентская часть (при помощи магии Гарри Поттера) станет бинарным файлом. Бог с ним, серверная часть не доступна обывателю, а это самое важное!!!

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

  1. При обращении клиента к серверу по http происходит проверка его ip на наличие в списках разрешенных. В противном случае показываем фигу.
  2. Проверяем, наличие актуального кеша, и отдаём его.
  3. Если кеша нет, генерируем новый.
  4. Если запрос прилетел от zabbix: принудительно считаем кеш устаревшим, генерируем новый и после этого рассылаем всем клиентам оповещения по UDP протоколу. Это позволит свести расход ресурсов базы данных к нулю т.к все клиенты ринутся забирать новые данные, а все уже в кеше.

Супер, все дешево и сердито.

Серверная часть представляет из себя файл index.php где-то на Вашем web сервере. Актуально для Zabbix 2.4 (скорее всего будет актуальна и для последующих версий, будем проверять по мере возрастания аппетита).

Скрытый текст

<?PHP
# Храним файл кэша вне web сервера!!!, желательно во временной директории вашей UNIX системы.
$cacheFile = '/tmp/zabbix_trigger.json';
# Время жизни кэша в секундах, по его истечении и только по запросу клиента кэш файл перезаписывается новыми данными (если не было сигнала от zabbix).
$cacheInterval = 60;
# Список разрешенных IP адресов, они же являются и списком для оповещения.
$client = array(
    # Администраторы
    '10.10.10.100',
    '10.10.10.101',
    '10.10.10.102',
    # Дежурные
    '10.10.10.200',
    # Начальство
    '10.10.10.210',
);
# Настройки доступа к MySQL
$settings = array(
    'db'    => 'zabbix', 
    'login' => 'zabbix',
    'pass'  => 'zabbix'
);
# Определяем кто запустил скрипт, zabbix или хост из вне
$alarm = (substr(PHP_SAPI, 0, 3) == 'cli') ? true : false;

# Не работаем с не зарегистрированными клиентами
if(!$alarm) {
    if(!in_array($_SERVER['REMOTE_ADDR'], $client)) exit();
}
# Работа с БД
class db extends PDO
{
    # Начальные данные для подключения к серверу
    private $settings = array(
        'host'  => 'localhost',
        'db'    => '',
        'login' => 'root',
        'pass'  => '',
    );
    #
    function __construct($settings = array())
    {
        # Изменяем конфигурацию
        if(is_array($settings) and 0 != count($settings)) {
            foreach($settings as $key => $val) {
                if(isset($this->settings[$key])) $this->settings[$key] = $val;
            }
        }
        # Подключаемся к базе данных
        try {
            parent::__construct('mysql:host='.$this->settings['host'].';dbname='.$this->settings['db'].';charset=utf8', $this->settings['login'], $this->settings['pass']);
        }
        catch(PDOException $error) {
            echo $error->getMessage();
            exit();
        }
    }
}

if(!file_exists($cacheFile) or $cacheInterval < (time()-filemtime($cacheFile)) or $alarm) {
    $message = array(
        'trigger' => array(),
        'group' => array(),
    );
    
    $db = new db($settings);
    $query = $db->query("
    SELECT
        t.triggerid,
        h.hostid,
        h.host,
        g.groupid,
        t.priority,
        t.description,
        t.lastchange,
        t.error,
        it.ip
    FROM
        triggers t,
        hosts h,
        items i,
        functions f,
        interface it,
        groups g,
        hosts_groups hg
    WHERE
        t.value=1 AND
        t.status=0 AND
        f.triggerid=t.triggerid AND
        i.itemid=f.itemid AND
        i.status=0 AND
        h.hostid=i.hostid AND
        h.status=0 AND
        h.hostid = it.hostid AND
        h.hostid = hg.hostid AND hg.groupid = g.groupid
    ORDER BY
        t.lastchange DESC
    ");
    if($query->rowCount()) {
        foreach($query->fetchAll(PDO::FETCH_ASSOC) as $var => $val) $message['trigger'][$val['triggerid']] = $val;
    }
    $query = $db->query("
    SELECT 
        h.hostid,
        h.host,
        h.name showname,
        g.name,
        g.groupid,
        i.ip
    FROM 
        hosts h,
        groups g,
        hosts_groups hg,
        interface i
    WHERE 
        h.status=0 and h.flags=0
        and
        h.hostid = hg.hostid and hg.groupid = g.groupid and h.hostid = i.hostid
    ORDER BY g.name ASC, h.name ASC
    ");
    if($query->rowCount()) {
        foreach($query->fetchAll(PDO::FETCH_ASSOC) as $var => $val) {
            $message['host'][$val['groupid']][$val['hostid']] = $val;
            if(!isset($message['group'][$val['groupid']])) $message['group'][$val['groupid']] = $val['name'];
        }
    }
    $query = $db->query("SELECT `sysmapid`, `name` FROM `sysmaps` ORDER BY sysmapid ASC");
    if($query->rowCount()) {
        foreach($query->fetchAll(PDO::FETCH_ASSOC) as $var => $val) {
            $message['map'][$val['sysmapid']] = $val['name'];
        }
    }
    file_put_contents($cacheFile, json_encode($message), LOCK_EX);
    if(!$alarm) chmod($cacheFile, 0666);
}
if(!$alarm) echo file_get_contents($cacheFile);
else {
    # Отсылаем администраторам предупреждение о событии
    $socket = socket_create(AF_INET, SOCK_DGRAM, GetProtoByName('udp'));
    foreach($client as $ip) {
        socket_connect($socket, $ip, 5055);
        socket_write($socket, 'trigger');
    }
    socket_close($socket);
}
?>

 

Для дополнительной безопасности рекомендую создать отдельную учетную запись в базе данных с правами только на чтение и только к базе zabbix. Это актуально в наши дни.

Переходи в zabbix

Первым делом переходим в Настройка -> Действия -> Источники события: Триггеры и создать новое действие. Назовем случайным образом, например Report problems to ZabbixTrigger.

В условиях выставляем

Значение триггера = ПРОБЛЕМА		
Значение триггера = OK

Это все необходимо, чтобы проблемы в GUI появлялись и исчезали точно именно тогда, когда это происходит в Zabbix (не путать с dashboard).

Вкладка "Операции" должна выглядеть следующим образом. Естественно что путь до php скрипта должен быть вашим.

Скрытый текст

zti7.thumb.jpg.266d1ac1c77d32a38bfeb2202

Вуаля! Если Вы все сделали правильно (без кардинальных изменений), то я рад приветствовать нового ездока моего велосипеда. Поедем тандемом!

Сам клиент прикреплен в конце поста.

Для тех, кто читает титры в кинотеатре

При запуске будет создан файл config.ini в корне программы. При необходимости, измените его настройки, благо их не много.

[server]
url="http://zabbix/zabbix-gui"
update="60"

[client]
showalarm="20"

Параметр url отвечает за http путь до скрипта на сервере, update за интервал (в секундах) обновления данных с сервера, а showalarm вроде как должен влиять на время отображения всплывающей подсказки в трее.

Теперь немного структуры.

  1. В каталоге sounds находится звук оповещения о новом триггере, формат ogg
  2. Каталог icons содержит маркеры триггеров. trigger00 - для нормального состояния, а все последующие соответствуют начальным настройкам zabbix во вкладке Администрирование -> Общие раздел Важность триггеров. Можете изменить на свои цвета, программа все подхватит при перезагрузки.
  3. Ну и на закуску каталог ext, это как говорится для меломанов, содержит фри программы для обработки внешних действий клиента. Вы можете заменить их на свои при условии, что стандартные имена параметров запуска и их последовательность совпадают.

PS: На этом все, спасибо тем кого это заинтересовало. Предлагайте свои идеи или способы доработки велосипеда. А если найдется программист на C++ так милости просим. В любом случае, функционал будет в дальнейшем расширяться.

zabbixTrigger.zip

  • Like 2

Share this post


Link to post
Share on other sites

Доброе время суток.

После одного из обновлений Windows появились сбои в работе программы. Пришлось заново компилировать все это хозяйство. Плюс решено все-таки начать переводить программу на правильный язык программирования и делать её Мультиплатформеной. По этим причинам выкладываю все исходники и последний собранный вариант с некоторыми мелкими фиксами.

Итак, как уже упоминалось ранее, программа написана на PHP и, чтобы превратить её в исполняемый файл понадобится среда разработки DevelStudio

Проект DVS и распакованный проект с дополнительными файлами и собранной программой (в каталоге build) прикреплены к посту. Почти весь код описан в файлах в каталоге scripts. Серверная часть по-прежнему актуальна и описана в предыдущем сообщении.

ZabbixTrigger.dvs.tar

ZabbixTrigger.zip

  • Like 2

Share this post


Link to post
Share on other sites

Спасибо. Полезно. Сейчас дорабатываю Ваши исходники так, чтобы повторялись звуковые оповещения если узел  лежит. Ну и опционально можно будет добавить звук о подъёме узла. Используем Zabbix 3.2.3. О результатах сообщу и выложу исходники.

Edited by Poldan
  • Like 1

Share this post


Link to post
Share on other sites
В 04.04.2017 в 18:16, Poldan сказал:

Спасибо. Полезно. Сейчас дорабатываю Ваши исходники так, чтобы повторялись звуковые оповещения если узел  лежит. Ну и опционально можно будет добавить звук о подъёме узла. Используем Zabbix 3.2.3. О результатах сообщу и выложу исходники.

Вобщем, кое чё наваял. При падении узла (группы узлов) прога бомкает пока не жмякнешь на кнопку. Если через пять минут не поднялся - бомкает один раз. Через 20ть - жужжит один раз. Поднялся - пиликает один раз. И так по кругу. Автор (топикстартер) зачем-то не стал показывать ещё одну крутую возможность, которую он наваял - показ карт сетей. Видимо из-за того, что при повторном двойном клике на карту (после закрытия её), картинка не обновлялась. Проблему эту я решил топорно (а может и нет 9_9) - просто делаю unset объекта. А php скрипт, передающий в прогу карты, банально переделал из найденного в гугле скрипта отрисовки графиков. Комментами и красотой кода особо не заморачивался. Так что не пинайте. А. И ещё - иконка в трее меняет цвет (ну это было ваще просто :) ).

P.S. Насчёт карт - оказывается объяснение тут (тока заметил :) ) - 

 

zab.zip

Edited by Poldan
  • Like 2

Share this post


Link to post
Share on other sites

Спасибо! А если база и вебка на разных серверах? Если я правильно понимаю, то нужно здесь что то добавить?

# Настройки доступа к MySQL
$settings = array(
    'db'    => 'zabbix', 
    'login' => 'zabbix',
    'pass'  => 'zabbix'
);

Немного подумав разобрался, нужно изменить на IP сервера с базой:

'host'  => 'localhost'
Edited by MichaelG
  • Like 2

Share this post


Link to post
Share on other sites

Здравствуйте! Спасибо Вам за статью! Подскажите, как быть с версией zabbix 3.4 - там в действиях нет возможности выбрать условие - "значение триггера".

Share this post


Link to post
Share on other sites

Доброе время суток @mrmarkalex

К сожалению под рукой нет сервера версии 3.4, но я Вам посоветую действовать опираясь на уже имеющееся по умолчанию во всех версиях Zabbix действие - "Report problems to Zabbix administrators". Скопируйте его и просто переопределите действие с оповещения на выполнение внешнего скрипта.

  • Thanks 1

Share this post


Link to post
Share on other sites

Спасибо Вам за совет. Сделал действие по умолчанию, изменил оповещение через внешний скрипт. Однако, есть проблемка: при настройке config файла, почему-то не видит Zabbix-сервер если указать http://xxx.xxx.xxx.xxx/zabbix/zabbix-gui/ хотя файл сервера index.php лежит по указанному адресу. Если же указать http://xxx.xxx.xxx.xxx/zabbix/ то видит сервер, но не может преобразовать json ну оно и понятно - файла серверной части то там нет.

Не подскажите - как быть, я не совсем силён в php, но ваша программа нужна для системы мониторинга на zabbix как воздух)

 
Edited by mrmarkalex

Share this post


Link to post
Share on other sites
03.09.2018 в 09:53, mrmarkalex сказал:

при настройке config файла, почему-то не видит Zabbix-сервер если указать http://xxx.xxx.xxx.xxx/zabbix/zabbix-gui/ хотя файл сервера index.php лежит по указанному адресу.

Пройдите по указанному адресу с помощью браузера и убедитесь, что скрипт Вам ответил, и предоставленные им данные визуально соответствуют формату json. Отсутствуют ошибки в ходе исполнения php на сервере. Также, ip адрес хоста с которого производится подключение к серверной части должен быть указан в массиве разрешенных адресов.

Скрытый текст

$client = array(
    # Администраторы
    '10.10.10.100',
    '10.10.10.101',
    '10.10.10.102',
    # Дежурные
    '10.10.10.200',
    # Начальство
    '10.10.10.210',
);

 

 

  • Thanks 1

Share this post


Link to post
Share on other sites

Скрипт по указанному адресу в браузере не отвечает. IP адрес хоста указан в массиве разрешённых адресов. Может просто скопировать файл index.php в директорию usr/share/zabbix/zabbix-gui и перезапустить apache недостаточно, уж простите меня за эти глупые вопросы, просто хочется докапаться до истины)

Edited by mrmarkalex

Share this post


Link to post
Share on other sites

@mrmarkalex каталог на который Вы ссылаетесь используется самим Zabbix, хранить там что-то постороннее не стоит. Для теста используйте каталог, прописанный в VirtualHost начальной конфигурации Apache, если конечно Вы используете Apache, я буду думать, что так оно и есть.

Например, для Ubuntu Server путь можно посмотреть в /etc/apache2/sites-enabled/000-default.conf а интересующий нас каталог прописан как

DocumentRoot /var/www/html

Вот по этому адресу и создайте каталог с любым именем и в нем разместите index.php с содержимым указанным Выше.

Также у Вас должен быть установлен PHP и модуль к нему pdo_mysql

PS: Помните, что в каждой системе могут быть свои пути и конфигурационные файлы.

  • Thanks 1

Share this post


Link to post
Share on other sites
06.09.2018 в 15:41, Kitsum сказал:

@mrmarkalex каталог на который Вы ссылаетесь используется самим Zabbix, хранить там что-то постороннее не стоит. Для теста используйте каталог, прописанный в VirtualHost начальной конфигурации Apache, если конечно Вы используете Apache, я буду думать, что так оно и есть.

Например, для Ubuntu Server путь можно посмотреть в /etc/apache2/sites-enabled/000-default.conf а интересующий нас каталог прописан как


DocumentRoot /var/www/html

Вот по этому адресу и создайте каталог с любым именем и в нем разместите index.php с содержимым указанным Выше.

Также у Вас должен быть установлен PHP и модуль к нему pdo_mysql

PS: Помните, что в каждой системе могут быть свои пути и конфигурационные файлы.

Спасибо Вам большое! Все работает замечательно ... нашёл ещё кое-какие у себя косяки. Осталась одна проблема: карты, в программе они отображаются, но не открываются. Необходимо указать sysmapid этих карт в скрипте graphics.php? Не совсем, понял где в скрипте нужно указывать id нужных карт.

php7.0-curl установлен на Ubuntu server. Файл graphics.php расположен рядом со скриптом index.php

Edited by mrmarkalex

Share this post


Link to post
Share on other sites

@mrmarkalex в используемой Вами версии Zabbix отсутствует возможность построения изображений, в частности карт сетей, в виде растровой графики, что делает "парсинг" картинок посредством curl не актуальным. Стоит поискать в сети упоминания об актуальных способах для Zabbix v3.4 и выше, возможно есть экспорт графиков и карт в API или альтернативные способы описывались в интернете, это нужно проверять, просмотреть актуальную документацию.

  • Thanks 1

Share this post


Link to post
Share on other sites

Ещё раз Вам спасибо за замечательную программку, очень полезный инструмент особенно для тех, кто в программировании не силён)

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

Share this post


Link to post
Share on other sites
1 час назад, mrmarkalex сказал:

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

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

update="60"

Но имеется еще и ограничение в серверной части т.к данные кэшируются для уменьшения нагрузки при массовом обновлении информации на клиентах. Управлять временем жизни кэша на сервере можно с помощью параметра в файле index.php

$cacheInterval = 60;

Время жизни кэша также указывается в секундах.

  • Thanks 1

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

  • Similar Content

    • By Kitsum
      Модуль предназначен для системы мониторинга Zabbix. Работает в качестве отдельного демона и осуществляет транзит сообщений от брокера до хостов в системе мониторинга. Подробное описание модуля можно посмотреть в следующей теме.
       
    • By Kitsum
      Шаблон и список преобразований значений для мониторинга источников бесперебойного питания фирмы APC. 
      Подробное описание можно посмотреть в следующей теме.
       
    • By Kitsum
      Делюсь шаблоном для мониторинга состояния маршрутизаторов CISCO, zabbix 2.4
      Работа с устройством реализована по протоколу SNMP и тут есть ряд подводных камней, но самый основной это изменения стандарта от одной версии прошивки к другой.
      Если понадобится изменить OID значения, то поискать их можно тут http://tools.cisco.com/Support/SNMP/do/BrowseOID.do но часть старый параметров в базе отсутствует. Тут уж или через поисковик или "Селяви, что в перевод с древнегреческого - не повезло!".
      Простая конфигурация устройства:
      cisco-test#configure terminal Enter configuration commands, one per line. End with CNTL/Z. cisco-test(config)#snmp-server community public RO cisco-test(config)# Но при этом любой может подключиться к устройству и читать с него данные, если вы хотите чтобы плохие люди могли еще и отдавать команды то RO необходимо заменить на RW
      Если Вы желаете ограничить доступ к SNMP серверу устройства по IP, то необходимо использовать access-list:
      cisco-test#configure terminal Enter configuration commands, one per line. End with CNTL/Z. cisco-test(config)#ip access-list standard SNMP_ACCESS_RO cisco-test(config-std-nacl)#permit 192.168.1.2 cisco-test(config)#snmp-server community public RO SNMP_ACCESS_RO cisco-test(config)#^Z cisco-test# Сommunity можно обозвать как угодно, хоть BLABLABLA место public. IP естественно заменить на адрес Вашего сервера. RO - только чтение, RW - полный доступ
      Мы будем только читать, поэтому RO. В теории конечно можно отлавливать определенные события на устройстве и предпринимать ответные действия автоматически, только в таких случаях RW. Но об этом мы поговорим в другой раз.
      Теперь необходимо добавить макрос в zabbix Администрирование -> Общие -> Макросы
      {$SNMP_COMMUNITY} = имя community указанное в конфигурации CISCO, например "public" Сам шаблон можно забрать в конце поста.
      Немного о шаблоне.

      На данным момент собираются данные:
      Аптайм Модель маршрутизатора Загрузка центрального процессора за: 5 секунд, 1 минуту, 5 минут Статус (online\offline) Память: ОЗУ, ПЗУ Список доступных интерфейсов Статусы сетевых интерфейсов Количество byte RX\TX на каждом интерфейсе Количество error byte RX\TX на каждом интерфейсе По этим данным строятся соответствующие графики (ОЗУ, ПЗУ и т.п не выведены, можете добавить самостоятельно)
      Пока маловато триггеров, но по мере обновления шаблона, их количество увеличится:
      Маршрутизатор выключен или с ним нет связи по Ethernet Маршрутизатор был пере запущен менее 5 минут назад Нагрузка на ЦП выше 80%  PS: следите за обновлениями!
      zbx_templates_router_cisco.xml
    • By Kitsum
      Речь пойдет о мониторинге источников бесперебойного питания, в моём случае SMART-UPS 5000 RM, по протоколу SNMP. Версия Zabbix 2.4. Использовать Ethernet для этих целей очень выгодно т.к это избавляет от лишнего звена в виде компьютера подключенного по COM или USB, но ИБП должен быть укомплектован сетевой платой Apc Network Management Card (NMC).
      У меня все прекрасно заработало на ИБП: SMART-UPS 1000\1500\5000\8000. Уверен, что все получится и с другими моделями.
      Доступное мне оборудование использует NMC: AP9617, AP9619, AP9631.
      И так, к делу.
      Первоначально необходимо произвести сброс настроек NMC.
      На лицевой стороне NMC есть еле заметное отверстие с красующейся надписью Reset. Ковырять там, разогнутой скрепкой, можно на работающем устройстве.
      Я использовал два вида кабелей
      COM to COM - ID 940-1524D USB to COM - ID 940-0272A Для подключения можно использовать как специализированный софт, так и обычный терминал. Я использовал PuTTY, что и Вам советую. Со скоростью поэкспериментируйте (у меня диалог с железкой завязался на 2400).
      После подключения жмем Enter и появляется запрос на авторизацию. По умолчанию логин и пароль: apc
      Настройка реализована в виде диалога с вариантами ответа как в дешевой квест-рпг игре.
      Пример начального квеста:
      Теперь продолжить настройку ИБП можно через Web интерфейс. Там все еще проще, описывать нет смысла, главное настройте SNMP COMMUNITY.
      Переходим к Zabbix.
      Для начала необходимо создать макрос {$SNMP_COMMUNITY} со значением SNMP COMMUNITY которое выставлено в настройках ИБП.
      Теперь необходимо пройти в Администрирование -> Общие -> Преобразование значений и импортировать список преобразований. Соответствующий файл есть в архиве. Без этих таблиц, во время импортирования шаблона вылетит ошибка и операция будет остановлена.
      Теперь можно импортировать сам шаблон, он как всегда, во вложении к данному посту.
      Что имеется на данные момент:
      Элемента данных
      Версия прошивки микропроцессора Верхний порог (V) для перехода на работу от батареи Время, прошедшее с момента как ИБП перешел на работу от батареи Входное максимальное зарегистрированное напряжение Входное минимальное зарегистрированное напряжение Входное напряжение Выходная потребляемая нагрузка в амперах Выходное напряжение Индикатор замены батареи Модель устройства Напряжение батареии Нижний порог (V) для перехода на работу от батареи Оставшееся время автономной работы Причина последнего перехода на работу от батареи Серийный номер микропроцессора Статус ONLINE\OFFLINE Статус батареи Текущая нагрузка Текущее состояние ИБП Температура батареи Температура внутри ИБП Уровень заряда батареи Частота входной линии Частота выходной линии Триггеры
      ИБП: Работает от батареи ИБП: батарея в аварийном состоянии ИБП: батарея разряжена ИБП: выключен или с ним нет связи по Ethernet ИБП: заряд батареи менее 25% ИБП: заряд батареи менее 50% ИБП: заряд батареи менее 75% ИБП: зафиксирован высокий скачек напряжения на входной линии ИБП: зафиксировано сильное падение напряжения на входной линии ИБП: нагрузка превысила 80% ИБП: нагрузка превысила 85% ИБП: нагрузка превысила 90% ИБП: нагрузка превысила 100% ИБП: необходимо заменить батарею ИБП: температура батареи превысила 40 градусов С Графики
      Входное и выходное напряжение Нагрузка (A, %) Оставшееся время автономной работы Состояние батареи Частота входной и выходной линии (Гц) Ниже добавлю несколько изображений с графиками, но для полноты данных они взяты уже не с 5000 серии, а с 1500.
      PS:  Хочу добавить, что некоторые данные могут не поступать, например температура батареи. Это, как я понял, зависит от комплектации конкретного ИБП.
       
    • By Kitsum
      Update 03.12.2015
      Добавлена возможность отображать DNS имена для определенных хостов, это позволит явно и человеко-понятно идентифицировать соответствующие узлы в сети. Отсутствие записи на DNS сервере должно привлечь соответствующее внимание к хосту.  
      В конфигурацию добавлен параметр $domain позволяющий удалять из DNS имени хоста имя домена. Чтобы из name.domain.com сделать name, необходимо указать $domain = ".domain.com" Обновлена база производителей сетевого оборудования - oui.txt Мелки доработки интерфейса.  
      Update 26.11.2015
      Добавлена возможность отображать реальные имена портов (Fa1, Ethernet1/0/1, Port1 ...). Внимание: не все устройства способны передавать данную информацию, в связи с этим оставлены числовые идентификаторы, чтобы в таких случаях иметь систему идентификации.  
      Добавлена возможность описывать в конфигурации настройки для каждого устройства отдельно. Если не использовать эту возможность, то для оборудования будет применена общая конфигурация. Добавлена возможность описывать в конфигурации уникальные OID-ы для конкретного оборудования аналогично п.2. Мелкие доработки интерфейса и кода.  

      В данной теме мы будем рассуждать о мониторинге сетевого оборудования и подключенных к нему хостах. Следовало бы разместить её в другом разделе, но 90% всех манипуляций и дальнейшая эксплуатация будет производиться на UNIX-подобной платформе. В моем случае используется:
      Linux Ubuntu 14.04 Apache/2.4.7 PHP 5.5.9 Библиотека php5-snmp Также само сетевое оборудование (маршрутизаторы и свичи) должно поддерживать работу по протоколу SNMP и соответствовать стандартам ISO.
      Проект разработан отталкиваясь от топологии сети - звезда. Имеются множество отдельных подсетей 192.168.0.0 все они ходят во внешний мир через маршрутизаторы (в моем случае фирмы Cisco). В самих подсетях используются различные свичи, по большей части поддерживающие SNMP v1 и выше.
      Ранее я уже поднимал данную тему на другом, дружественном, форуме, но потом работа над проектом бала остановлена. На данный момент вопрос опять стал актуален и решено переделать как основную программу, так и внешний вид. Старая версия была написана на скорую руку и выглядела невзрачно и с большими изъянами в коде.
      На данный момент проект преобразился и выглядит следующим образом. Ваш браузер должен поддерживать HTML5.
      Чтобы избежать вопроса "зачем это нужно?" предлагаю Вам задачку. Попробуйте назвать номер порта на свиче к которому подключен компьютер дяди Васи зная лишь его IP. Или еще интереснее - зная лишь производителя его сетевого оборудования. Или вопрос от начальника "Скажи мне, кто подключен к этому свичу, а я пока узнаю, кого нужно искать".
      Раньше это делалось следующим образом. Подключаемся к маршрутизатору и спрашиваем, какой MAC принадлежит интересующему нас IP, пусть это будет 192.168.0.3
      cisco-router#sh arp | include Vlan1 Internet 192.168.0.1 210 0800.0694.d027 ARPA Vlan1 Internet 192.168.0.2 210 0800.bdf0.0010 ARPA Vlan1 Internet 192.168.0.3 210 000e.be08.001c ARPA Vlan1 Internet 192.168.0.4 210 000e.42ee.20cf ARPA Vlan1 Internet 192.168.0.5 210 0800.218e.be09 ARPA Vlan1 Internet 192.168.0.6 5 20cf.0800.000e ARPA Vlan1 Internet 192.168.0.7 - 001c.0010.000e ARPA Vlan1 Internet 192.168.0.8 6 0010.1fc4.0800 ARPA Vlan1 Internet 192.168.0.9 2 d027.0694.0800 ARPA Vlan1 ... Теперь мы знаем MAC, это 000e.be08.001c. Подключаемся к свичу и просим его показать нам таблицу MAC адресов с сортировкой по конкретному MAC-у.
      cisco-switch#sh mac-address-table | include 000e.be08.001c 000e.be08.001c Dynamic 1 FastEthernet21 Теперь мы знаем, что интересующий нас (или не нас) хост использует порт FastEthernet21
      Все прошло относительно быстро и гладко. Но что делать, если порт имеет порядковый номер превышающий общее число физических портов на свиче, оборудование разных производителей и оно не поддерживает одинаковый формат MAC адресов, отсутствуют различные фильтры, как например "include" в оборудовании Cisco. При этом может быть несколько свичей с десятками хостов. Все это повлияет на время поиска и на конечный результат.
      Реализация
      Мы знаем, что и у какого оборудования спрашивать. Так и давайте спрашивать это используя SNMP протокол. Первым делом необходимо настроить Ваше сетевое оборудование, выставить необходимые разрешения и community. Описывать этот пункт нету смысла т.к у Вас своё оборудования, а у дяди Васи совсем другое.
      На сервере, где установлен Apache необходимо доставить библиотеку реализующий работу snmpwalk в PHP
      apt-get install php5-snmp service apache2 restart На самом деле большая часть работы уже сделана. Теперь необходимо скачать сам скрипт, он будет прикреплен к данному посту и отредактировать его под себя.
      Редактируем .htaccess
      RewriteEngine On Options +FollowSymlinks Options -MultiViews RewriteBase /switch/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?$1 [L] Убедитесь, что у Вас подключен модуль mod_rewrite и измените относительный путь указанный в RewriteBase на удобный Вам. Если закинуть каталог switch в корневую веб директории Apach, то вносить изменений в файл не нужно.
      Редактируем index.php
      $url = 'http://'.$_SERVER["HTTP_HOST"].'/switch/'; $domain = '.domain.com'; $community = 'public'; $unit = array( 'network_id' => array( 'name' => 'Желаемое для отображения имя подсети или объекта где сеть эксплуатируется', 'router' => '192.168.1.1', 'switch' => array('192.168.1.2'), ), 'object_name' => array( 'name' => 'Желаемое для отображения имя подсети или объекта где сеть эксплуатируется', 'router' => '192.168.2.1', 'switch' => array('192.168.2.2', '192.168.2.3', '192.168.2.4'), ), // UPDATE 26.11.2015 'new_object' => array( 'name' => 'new object name', 'router' => '192.168.3.1', 'switch' => array('192.168.3.2', '192.168.3.3'), // Уникальные настройки для маршрутизатора 192.168.3.2 '192.168.3.1' => array( 'community' => 'public2', ), // Уникальные настрокий для свича 192.168.3.3 '192.168.3.3' => array( 'community' => 'public3', 'ifName' => '.1.3.6.1.2.1.31.1.1.1.1', 'dot1dBasePortIfIndex' => '.1.3.6.1.2.1.17.1.4.1.2', ), ), ); Мы старались сделать конфигурацию интуитивно понятной, получилось это или нет, спорный вопрос. Поживем увидем, а пока разберем, что тут к чему.
      $url - содержит http адрес до каталога со скриптом. Измените /switch/ на используемый Вами network_id, object_name - любой понравившийся идентификатор для подсети. Используйте латиницу и\или цифры и не используйте пробелы. name - описание для подсети. Оно будет отображаться в списке на главной странице скрипта и в навигационном баре router - IP адрес маршрутизатора, через который подсеть ходит во внешний мир switch - список IP адресов свичей используемых в подсети Можно производить уникальную конфигурацию для любого сетевого устройства. Для этого в конфигурации нужного объекта необходимо указать адрес устройства и описать массив настроек для него. Можно изменять абсолютно любые существующие значения в скрипте. ВНИМАНИЕ: если Вы не понимаете, за что отвечает та или иная переменная и как устроена эта кухня, лучше обратитесь к нам, и мы Вам обязательно поможем!
      Список рекомендуемых для изменения значений (описание значений имеется в самом скрипте):
      community atPhysAddress sysDescr dot1dTpFdbAddress dot1dTpFdbPort dot1dBasePortIfIndex ifName Определение производителя по MAC адресу
      Каждому производителю выделяется определенный список MAC адресов для использования в его сетевом оборудовании. Ознакомиться с этим списком можно по адресу http://standards-oui.ieee.org/oui.txt Мы включили этот файл в состав архива, но советуем Вам периодически обновлять его.
      В скрипте используется shell_exec
      $vendor = explode('(hex)', shell_exec("cat ./oui.txt | grep ".str_replace(' ', '-', substr($mac, 0, 8)))); Это потенциально не безопасно, но мы не передаем ей данные полученные от пользовательского ввода, только MAC адреса. В любом случае shell_exec должен быть разрешен или часть кода, отвечающая за определения производителя, должна быть удалена.
      Есть очень интересная статья на сайте CISCO. Она поможет Вам разобраться в принципах работы данного скрипта. К сожалению я узнал об этой статье уже после написания большей части кода программы. Но уже имеются идеи для следующей версии!
      PS: Если все сделано правильно, то Вы сможете насладится нашим велосипедом. Проект будет дорабатываться и обрастать всяческими "свистульками". Приятного использования 😃
       
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...