Низкоуровневое обнаружение в Zabbix

Есть в моём царстве-государстве железка одна – Zyxel IES-1248 – 48-мипортовый DS-LAM. Добавил я его, значит, в Zabbix, а шаблона встроенного подходящего нет! Хотелось бы мониторить как минимум статус портов (up/down).

В мануалах встречается упоминание про LLD – Low-Level Discovery (Низкоуровневое обнаружение), когда Zabbix сам обнаруживает различные объекты и добавляет их по шаблону.

Вот с пониманием этой технологии у меня было туговато. Никак не выходило сделать обнаружение интерфейсов DSLAM-а. И вот, наконец, вышло кое-что. Спешу оставить небольшой Manual.

План действий

  1. Переходим в раздел “Настройка – Узлы сети”;
  2. Напротив нашего устройства (Zyxel DSLAM) выбираем пункт “Обнаружение”;
  3. Создаём правило обнаружения:
    Указываем здесь следующие параметры:
    • Имя: Произвольное (DiscoverZabbixIface);
    • Тип: SNMPv2 агент;
    • Ключ: snmp.discovery;
    • SNMP OID: discovery[{#SNMPVALUE},1.3.6.1.2.1.2.2.1.8]
      Поясню этот OID. При помощи snmpwalk я выяснил, что в этом разделе находятся OperStatus портов. Как выяснил? Просто получил snmpwalk-ом все параметры и искал значения, в которых на оффлайновых портах стояли значения иные, чем на онлайновых. Желательно типа 1/2 (как в Cisco).
  4. В этом правиле обнаружения создадим прототип элемента данных:
    • Имя: Статус порта aDSL-{#SNMPINDEX};
    • Тип: SNMPv2 агент;
    • Ключ: snmp.discovery[{#SNMPINDEX}];
    • SNMP OID: 1.3.6.1.2.1.2.2.1.8.{#SNMPINDEX};
  5. Ждём некоторое время (у меня заняло примерно минуту), и идём в “Мониторинг – Последние данные”:

Конечно, можно было обойтись и без LLD, создавая порты вручную, но что-то черезчур муторно делать рутинную операцию 50 раз. Зато теперь я немного модернизировал скрипт из предыдущей статьи и теперь он подходит для DSLAM:

Осталось подписать порты и мониторинг стал ещё удобнее!

Кстати, выкладываю исходники скриптов:

Развернуть »

<style> .port{width:auto;height:25px;text-align:center;font-size:0.8em;} #tooltip { z-index: 9999; position: absolute; display: none; top:0px; left:0px; background-color: #000; padding: 5px 10px 5px 10px; color: white; opacity: 0.6; border-radius: 5px; } .switch{ font-size:2em; text-align: center; background-color: #4974ad; color: #fff; } </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $(function(){ $("[data-tooltip]").mousemove(function (eventObject) { $data_tooltip = $(this).attr("data-tooltip"); $("#tooltip").text($data_tooltip) .css({ "top" : eventObject.pageY + 15, "left" : eventObject.pageX + 5 }) .show(); }).mouseout(function () { $("#tooltip").hide() .text("") .css({"top" : 0,"left" : 0}); }); function updateswitch() { $.ajax({ url:"http://192.168.1.96/operstatus.php", type: "POST", data: {hostid:'10257'}, success: function (response){ response.forEach(function(item,i,response){ switch (item){ case '1': $('#port'+(i+1)).css('background-color','#6f6'); break; case '2': $('#port'+(i+1)).css('background-color','#f66'); break; } }); }, dataType: "json"}); } setInterval(function(){ updateswitch(); },10000); updateswitch(); }); </script> <table width="640" cellpadding="1" cellspacing="1" border="1"> <tr> <td colspan="24"><div class="switch">Zyxel IES1248</div></td> </tr> <tr> <td><div class="port" id="port1" data-tooltip="">adsl-1</div></td> <td><div class="port" id="port5" data-tooltip="">adsl-5</div></td> <td><div class="port" id="port9" data-tooltip="">adsl-9</div></td> <td><div class="port" id="port13" data-tooltip="">adsl-13</div></td> <td><div class="port" id="port17" data-tooltip="">adsl-17</div></td> <td><div class="port" id="port21" data-tooltip=" ">adsl-21</div></td> <td><div class="port" id="port25" data-tooltip="">adsl-25</div></td> <td><div class="port" id="port29" data-tooltip="">adsl-29</div></td> <td><div class="port" id="port33" data-tooltip="">adsl-33</div></td> <td><div class="port" id="port37" data-tooltip="">adsl-37</div></td> <td><div class="port" id="port41" data-tooltip="">adsl-41</div></td> <td><div class="port" id="port45" data-tooltip="">adsl-45</div></td> </tr> <tr> <td><div class="port" id="port2" data-tooltip="">adsl-2</div></td> <td><div class="port" id="port6" data-tooltip="">adsl-6</div></td> <td><div class="port" id="port10" data-tooltip="">adsl-10</div></td> <td><div class="port" id="port14" data-tooltip="">adsl-14</div></td> <td><div class="port" id="port18" data-tooltip="">adsl-18</div></td> <td><div class="port" id="port22" data-tooltip="">adsl-22</div></td> <td><div class="port" id="port26" data-tooltip="">adsl-26</div></td> <td><div class="port" id="port30" data-tooltip="">adsl-30</div></td> <td><div class="port" id="port34" data-tooltip="">adsl-34</div></td> <td><div class="port" id="port38" data-tooltip="">adsl-38</div></td> <td><div class="port" id="port42" data-tooltip="">adsl-42</div></td> <td><div class="port" id="port46" data-tooltip="">adsl-46</div></td> </tr> <tr> <td><div class="port" id="port3" data-tooltip="">adsl-3</div></td> <td><div class="port" id="port7" data-tooltip="">adsl-7</div></td> <td><div class="port" id="port11" data-tooltip="">adsl-11</div></td> <td><div class="port" id="port15" data-tooltip="">adsl-15</div></td> <td><div class="port" id="port19" data-tooltip="">adsl-19</div></td> <td><div class="port" id="port23" data-tooltip="">adsl-23</div></td> <td><div class="port" id="port27" data-tooltip="">adsl-27</div></td> <td><div class="port" id="port31" data-tooltip="">adsl-31</div></td> <td><div class="port" id="port35" data-tooltip="">adsl-35</div></td> <td><div class="port" id="port39" data-tooltip="">adsl-39</div></td> <td><div class="port" id="port43" data-tooltip="">adsl-43</div></td> <td><div class="port" id="port47" data-tooltip="">adsl-47</div></td> </tr> <tr> <td><div class="port" id="port4" data-tooltip="">adsl-4</div></td> <td><div class="port" id="port8" data-tooltip="">adsl-8</div></td> <td><div class="port" id="port12" data-tooltip="">adsl-12</div></td> <td><div class="port" id="port16" data-tooltip="">adsl-16</div></td> <td><div class="port" id="port20" data-tooltip="">adsl-20</div></td> <td><div class="port" id="port24" data-tooltip="">adsl-24</div></td> <td><div class="port" id="port28" data-tooltip="">adsl-28</div></td> <td><div class="port" id="port32" data-tooltip="">adsl-32</div></td> <td><div class="port" id="port36" data-tooltip="">adsl-36</div></td> <td><div class="port" id="port40" data-tooltip="">adsl-40</div></td> <td><div class="port" id="port44" data-tooltip="">adsl-44</div></td> <td><div class="port" id="port48" data-tooltip="">adsl-48</div></td> </tr> </table> <div id="tooltip"></div>

Развернуть »

<?php header('Access-Control-Allow-Origin: *'); // itemids портов Cisco по порядку $P10255=array('29820','29821','29822','29823','29824','29825','29826','29827','29828','29829','29830','29831','29832','29833','29834','29835','29836','29837','29838','29839','29840','29841','29842','29843','29844','29845','29846','29847','29848','29849','29850','29851','29852','29853','29854','29855','29856','29857','29858','29859','29860','29861','29862','29863','29864','29865','29866','29867'); // itemids портов Zyxel IES1248 по порядку $P10257=array('31516','31517','31518','31519','31520','31521','31522','31523','31524','31525','31526','31527','31528','31529','31530','31531','31532','31533','31534','31535','31536','31537','31538','31539','31540','31541','31542','31543','31544','31545','31546','31547','31548','31549','31550','31551','31552','31553','31554','31555','31556','31557','31558','31559','31560','31561','31562','31563'); $ITEMS = array(); // В зависимости от пришедшего по POST ID хоста присваиваем определённый набор itemids switch ($_POST['hostid']){ case '10255': $ITEMS = $P10255; break; case '10257': $ITEMS = $P10257; break; } $header=array('Content-Type:application/json-rpc'); // Первый запрос - получаем авторизационный токен $params=array("jsonrpc" => "2.0","method" => "user.login","params" => array("user" => "apiuser","password" => "apiuser"),"id" => 0); $params_json=json_encode($params); $API_URL = 'http://192.168.1.96/zabbix/api_jsonrpc.php'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $API_URL); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POSTFIELDS, $params_json); $SESSION=json_decode(curl_exec($ch))->result; // Второй запрос - получаем данные хоста $params=array("jsonrpc"=>"2.0","method"=>"item.get","params"=>array("output"=>"extend","hostids"=>$_POST['hostid'],"itemids"=>$ITEMS),"auth"=>$SESSION,"id"=>1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params)); $retval = curl_exec($ch); curl_close($ch); $result = json_decode($retval); $portmap=array(); foreach ($result->result as $key => $item){ $portmap[$key]=$item->lastvalue; } echo json_encode($portmap); ?>

Like this post? Please share to your friends:

Comments:

Leave a Reply