Jump to content
iT4iT.CLUB
Kitsum

Выдергиваем карты сетей из Zabbix

Recommended Posts

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

Более года назад мне потребовалось выдергивать карты сетей из web интерфейса zabbix, но эта потребность была не долгой, и вскоре все было забыто. И вот недавно, разбирая закрома, наткнулся на реализацию этой идеи. 

Зачем это нужно?

Большинству людей, пользующихся системами мониторинга, достаточно того интерфейса, который предоставляет разработчик. А разработчик обычно останавливается на реализации web интерфейса. Можно забыть про всякие виджеты, push уведомления или иные способы оповещения "из коробки". Это сильно угнетает т.к у меня нет возможности постоянно смотреть на дашборд в ожидании каких либо событий. Да и вообще я могу быть погруженным в другие людские заботы или, что еще боле серьезное, отсутствовать на рабочем месте.

Чтобы как-то исправить две последние ситуации были реализованы следующие дополнения

  1. Push уведомления: Android, iOS, Windows - очень удобно получать информацию о проблемных узлах прямо на телефон. Порой решения проблемы приходят в голову быстрее, чем кто-либо еще о ней узнает.

  2. Мониторинг триггеров в GUI под Windows - пока что сырая, но вполне работоспособная система позволяющая получать всплывающие уведомления, сопровождающиеся звуковым оповещениям и интерфейсом для быстрого доступа к узлу.

Теперь захотелось пойти немного дальше и позволить удаленным приложениям забирать актуальные карты сетей по их идентификатору в zabbix интерфейсе. А также в планах вывести общую карту сети на большой монитор для всех коллег. И делать это, хотелось бы, не светя учетными данными пользователей zabbix и не нагружая сам сервер. В общем, эта мелочь будет описана в данной теме.

И так, что нам понадобится.

Т.к наличие zabbix подразумевает наличие web сервера и PHP, то вы даже не догадаетесь, на чем мы все будем писать? или догадаетесь? ... эээ блин!

Первым делом нам необходимо дополнить арсенал PHP модулем CURL. В данный момент у меня все это хозяйство крутиться на Ubuntu 16.04 с PHP-7.1 и добавить модуль можно следующим способом.

sudo apt-get update
sudo apt-get install php7.1-curl
sudo /etc/init.d/apache2 reload

Создаем на нашем web сервере, в произвольном месте, файл graphics.php со следующим содержимым

<?PHP
if(false) {
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
}

$settings = array(
    'request' => '',
    'name' => 'guestlogin',
    'password' => 'guestpassword',
    'autologin' => '',
    'enter' => 'Sign in'
);

function putImage($data = false) {
    header('Content-Type: image/png');
    header('Content-Transfer-Encoding: binary');
    if($data) echo $data;
}

if(isset($_GET['sysmapid']) and preg_match('/^[0-9]{1,2}$/', $_GET['sysmapid'])) {
    $imageUrl = 'http://localhost/zabbix/';
    $imageTmp = base64_encode(microtime(null));
    $imagePng = '/tmp/zabbixTrigger_map'.$_GET['sysmapid'];
    $cookie   = '/tmp/zabbixTrigger_cookie';

    if(file_exists($imagePng)) {
        if(time() - filemtime($imagePng) < 30) {
            putImage();
            exit(file_get_contents($imagePng));
        }
        unlink($imagePng);
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $settings);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    
    $post = (file_exists($cookie)) ? 'map.php?sysmapid='.$_GET['sysmapid'] : 'index.php';
    curl_setopt($ch, CURLOPT_URL, $imageUrl.$post);
    $data = curl_exec($ch);

    if(curl_getinfo($ch, CURLINFO_CONTENT_TYPE) != 'image/png') {
        curl_setopt($ch, CURLOPT_URL, $imageUrl.'map.php?sysmapid='.$_GET['sysmapid']);
        $data = curl_exec($ch);        
        file_put_contents($imageTmp, $data, LOCK_EX);
        
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        if(finfo_file($finfo, $imageTmp) == 'image/png') {
            file_put_contents($imagePng, $data, LOCK_EX);
            putImage($data);
        }
        else echo 'error';
        unlink($imageTmp);
    }
    else {
        file_put_contents($imagePng, $data, LOCK_EX);
        putImage($data);
    }
    curl_close($ch);
}
?>

Что здесь происходит.

Скрипт пытается авторизоваться на zabbix сервере. Советую, для этих целей, использовать гостевую учетную запись. И минуя прочий html шлак, забирает картинку по её идентификатору. Как узнать идентификатор нужной нам карты сети? Для этого откройте карту в дашборд zabbix, и в строке запроса, вы увидите её порядковый номер.

zabbix_get_maps_php_curl_1.png

Нас интересует переменная sysmapid, именно её мы будем использовать для передачи идентификатора для graphics.php

zabbix_get_maps_php_curl_2.png

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

$settings = array(
    'request' => '',
    'name' => 'guestlogin',
    'password' => 'guestpassword',
    'autologin' => '',
    'enter' => 'Sign in'
);

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

Жизненно необходимо указать http путь до zabbix сервера, это делается в переменной

$imageUrl = 'http://localhost/zabbix/';

Также имеются переменные, описывающие, где будут храниться временные файлы изображений и cookie на нашем сервере

$imagePng = '/tmp/zabbixTrigger_map'.$_GET['sysmapid'];
$cookie   = '/tmp/zabbixTrigger_cookie';

Скрипт кэширует изображения во временном каталоге и отдает его, если не прошло более 30 секунд с момента его создания. Также во временном каталоге будет храниться файл cookie необходимый для работы curl. 

ВАЖНО: не переносите эти файлы в рабочий каталог web сервера!

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

 

  • Like 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
      Шаблон и список преобразований значений для мониторинга источников бесперебойного питания фирмы APC. 
      Подробное описание можно посмотреть в следующей теме.
       
    • By Kitsum
      Модуль предназначен для системы мониторинга Zabbix. Работает в качестве отдельного демона и осуществляет транзит сообщений от брокера до хостов в системе мониторинга. Подробное описание модуля можно посмотреть в следующей теме.
       
    • 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
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...