Ad Widget

Collapse

Расширяем snmp lld скриптами

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • alex82
    Junior Member
    • Sep 2013
    • 6

    #106
    Originally posted by rico-x
    Еще вижу у вас snmp вывод отображает цифровой, установите и включите snmp-mibs-downloader
    Спасибо за содействие в решении проблемы.
    Теперь работает. Строку не менял, заработало после mib downloader
    На втором сервере тоже была ошибка, там попробую вариант с заменой строки.
    Last edited by alex82; 25-05-2014, 19:20.

    Comment

    • Rico-X
      Junior Member
      • Jun 2012
      • 22

      #107
      Originally posted by alex82
      Спасибо за содействие в решении проблемы.
      Теперь работает. Строку не менял, заработало после mib downloader
      На втором сервере тоже была ошибка, там попробую вариант с заменой строки.
      В строке просто добавлен регексп, вырезающий кавычки, если таковые встречаются. Скрипт для себя писал, многие проверки не учтены, чинил только то, с чем сталкивался у себя на оборудовании. По хорошему сделать свой регексп, убирающий все спецсимволы из выводов на этапе формирования, но это надо думать и отлаживать.

      Еще из скрипта можно убрать часть
      Code:
      if [[ "$3" -eq 1 ]]
      then
      grep -E "Type:(6|53)" $tmp/ifJSON.$fl | grep -v "Port LI" | grep -v "Port Vl" | grep -v "VLAN" | grep -v "EO0\/0" | sed -e '$s/,$//'
      else
      ее смысл в том что если третим параметром передать скрипту 1, то из вывода убирутся виртуальные интерфейсы, писал для цисковских брасов, без этого интерфейсов выходит несколько десятков тысяч, но в вашем случае этот кусок кода врядли нужен, также убрать fi после строки
      Code:
      grep -E "Type:(6|117|161)" $tmp/ifJSON.$fl | sed -e '$s/,$//'
      саму строку оставить.

      Comment

      • Gotcha
        Junior Member
        • May 2014
        • 23

        #108
        Rico-X, все заработало! Спасибо тебе огромное, ты человечище!!!

        Comment

        • misak
          Junior Member
          • Feb 2013
          • 8

          #109
          Originally posted by Jimson
          Для физических интерфейсов у меня есть отдельный "тэг" - Physical, он появляется в {#IFTAGS} если для интерфейса существует ifInErrors (.1.3.6.1.2.1.2.2.1.14). Собственно по этому тэгу (через глобальное регулярное выражение) интерфейс "попадает" в третье правило дискаверинга в шаблоне, и по этому "третьему правилу" создаются элементы данных характерные для реальных (физических) интерфейсов, как то if*Errors и if*Discard.

          А в целом вы все правильно поняли, {$LLD_IF_REGEX} для простого механизма фильтрации уникальной для хоста. Вот только AdminStatus лишний, в глобальных регулярных выражениях он проверяется, так что или просто ',Type:6,' в качестве маски используйте для выборки физических ethernet интерфейсов, или ',Physical,' для более общего фильтра, который даст список всех "физических" интерфейсов, и эзернеты, и атм, и serial, etc.
          Для Juniper-ов это не работает, скрипт помечает все интерфейсы как физические. Я тупо беру интерфейсы, в имени которых нет точки, для Джуниперов и цисок должно работать.

          Comment

          • Melanxolik
            Senior Member
            • Nov 2009
            • 174

            #110
            Jimson, снова вынужден просить вашей помощи, вылез не приятный момент:

            Code:
            # snmpwalk -v2c -c pub 1.10.1.8 ifDescr
            IF-MIB::ifDescr.1 = STRING: Ethernet Interface
            IF-MIB::ifDescr.2 = STRING: Ethernet Interface
            IF-MIB::ifDescr.3 = STRING: Ethernet Interface
            IF-MIB::ifDescr.4 = STRING: Ethernet Interface
            IF-MIB::ifDescr.5 = STRING: Ethernet Interface
            IF-MIB::ifDescr.6 = STRING: Ethernet Interface
            IF-MIB::ifDescr.7 = STRING: Ethernet Interface
            IF-MIB::ifDescr.8 = STRING: Ethernet Interface
            IF-MIB::ifDescr.9 = STRING: Ethernet Interface
            IF-MIB::ifDescr.10 = STRING: Ethernet Interface
            IF-MIB::ifDescr.11 = STRING: Ethernet Interface
            IF-MIB::ifDescr.12 = STRING: Ethernet Interface
            IF-MIB::ifDescr.13 = STRING: Ethernet Interface
            IF-MIB::ifDescr.14 = STRING: Ethernet Interface
            IF-MIB::ifDescr.15 = STRING: Ethernet Interface
            IF-MIB::ifDescr.16 = STRING: Ethernet Interface
            IF-MIB::ifDescr.17 = STRING: Ethernet Interface
            IF-MIB::ifDescr.18 = STRING: Ethernet Interface
            IF-MIB::ifDescr.19 = STRING: Ethernet Interface
            IF-MIB::ifDescr.20 = STRING: Ethernet Interface
            IF-MIB::ifDescr.21 = STRING: Ethernet Interface
            IF-MIB::ifDescr.22 = STRING: Ethernet Interface
            IF-MIB::ifDescr.23 = STRING: Ethernet Interface
            IF-MIB::ifDescr.24 = STRING: Ethernet Interface
            IF-MIB::ifDescr.25 = STRING: Ethernet Interface
            IF-MIB::ifDescr.26 = STRING: Ethernet Interface
            IF-MIB::ifDescr.27 = STRING: Ethernet Interface
            IF-MIB::ifDescr.28 = STRING: Ethernet Interface
            IF-MIB::ifDescr.29 = STRING: Ethernet Interface
            IF-MIB::ifDescr.30 = STRING: Ethernet Interface
            IF-MIB::ifDescr.31 = STRING: Ethernet Interface
            IF-MIB::ifDescr.32 = STRING: Ethernet Interface
            IF-MIB::ifDescr.100000 = STRING: vlan
            IF-MIB::ifDescr.100001 = STRING: vlan
            #
            Когда нормальный показывает так:
            Code:
            # snmpwalk -v2c -c pub 1.10.1.81 ifDescr
            IF-MIB::ifDescr.4 = STRING: lsi
            IF-MIB::ifDescr.5 = STRING: dsc
            IF-MIB::ifDescr.6 = STRING: lo0
            IF-MIB::ifDescr.7 = STRING: tap
            IF-MIB::ifDescr.8 = STRING: gre
            IF-MIB::ifDescr.9 = STRING: ipip
            IF-MIB::ifDescr.10 = STRING: pime
            IF-MIB::ifDescr.11 = STRING: pimd
            IF-MIB::ifDescr.12 = STRING: mtun
            IF-MIB::ifDescr.21 = STRING: lo0.16384
            IF-MIB::ifDescr.33 = STRING: me0
            IF-MIB::ifDescr.34 = STRING: me0.0
            IF-MIB::ifDescr.37 = STRING: bme0
            IF-MIB::ifDescr.38 = STRING: bme0.32768
            IF-MIB::ifDescr.501 = STRING: vlan
            IF-MIB::ifDescr.502 = STRING: ge-0/0/0
            IF-MIB::ifDescr.503 = STRING: ge-0/0/0.0
            IF-MIB::ifDescr.504 = STRING: ge-0/0/1
            IF-MIB::ifDescr.505 = STRING: ge-0/0/1.0
            IF-MIB::ifDescr.506 = STRING: ge-0/0/2
            IF-MIB::ifDescr.507 = STRING: ge-0/0/2.0
            IF-MIB::ifDescr.508 = STRING: ge-0/0/3
            IF-MIB::ifDescr.509 = STRING: ge-0/0/3.0
            IF-MIB::ifDescr.510 = STRING: ge-0/0/4
            IF-MIB::ifDescr.511 = STRING: ge-0/0/4.0
            IF-MIB::ifDescr.512 = STRING: ge-0/0/5
            IF-MIB::ifDescr.513 = STRING: ge-0/0/5.0
            IF-MIB::ifDescr.514 = STRING: ge-0/0/6
            Из-за того что LinkSys возвращает: Ethernet Interface
            скрипт не возвращает имена интерфейсов, еще смотрю они дублируются в ifName, может как-то можно по ifName определять?

            Comment

            • Jimson
              Senior Member
              • Jan 2008
              • 1327

              #111
              Originally posted by Melanxolik
              Из-за того что LinkSys возвращает: Ethernet Interface
              скрипт не возвращает имена интерфейсов, еще смотрю они дублируются в ifName, может как-то можно по ifName определять?
              Ну изменить OID на ifName, раз там нормальные имена.
              ($ifInOctets, $ifDescr) = $sess->bulkwalk(0, 10, [['.1.3.6.1.2.1.2.2.1.10'],['.1.3.6.1.2.1.2.2.1.2']]);
              Вместо .1.3.6.1.2.1.2.2.1.2 вписать то где имена интерфейсов есть.

              Comment

              • misak
                Junior Member
                • Feb 2013
                • 8

                #112
                Я вот сподобился переделать это все под trapper. Скрипт сильно покорежен - плохо знаю программирование. Буду благодарен за все правки. В самом скрипте я отфильтровываю интерфейсы, специфичные для JunOS.

                Очень полезно, когда несколько десятков тысяч интерфейсов.

                Нужен модуль перла Zabbix::Sender последней версии, в предпоследней баг с размером данных.
                Attached Files
                Last edited by misak; 21-08-2014, 13:51. Reason: Поправил файл

                Comment

                • Melanxolik
                  Senior Member
                  • Nov 2009
                  • 174

                  #113
                  Если по теме пройтись, то тут будет информация о задваивании. Это касается только определенных версий забикса.

                  Вот так и нету не каких задваиваний в последних версиях.
                  Port:{#IFDESCR}: A)Traffic - {#IFALIAS}



                  Да, порывшись в перле, сделал так:

                  Code:
                  my ($ifInOctets, $ifDescr, $ifType, $ifAdmin, $ifName, $ifInErrors, $ifHCInOctets, $ifAlias, $vpnVar, $vpnIndex) = ();
                  Code:
                      ($ifInOctets, $ifDescr, $ifName) = $sess->bulkwalk(0, 10, [['.1.3.6.1.2.1.2.2.1.10'],['.1.3.6.1.2.1.2.2.1.2'],['.1.3.6.1.2.1.31.1.1.1.1']]);
                      error('bulkwalk [ifInOctets, ifDescr, ifName]', $sess->{ErrorStr}) if ($sess->{ErrorNum});

                  Code:
                  for (@$ifDescr) {
                      if (exists $json{ $_->iid } and not $_->val =~ /^NOSUCH/i) {
                      if ( $_->val =~ /^Ethernet Interface/i) {
                          $json{ $_->iid }->{IFDESCR} = @$ifName[$_->iid]->val;
                          $json{ $_->iid }->{IFTAGS} = TAGSEP . @$ifName[$_->iid]->val . TAGSEP;
                      } else {
                              $json{ $_->iid }->{IFDESCR} = $_->val;
                              $json{ $_->iid }->{IFTAGS} = TAGSEP . $_->val . TAGSEP;
                          }
                      }
                  }
                  Актуально для Linksys где вместо имени интерфейса прилетает что это просто Ethernet address, тогда это поле заполняется из ifName.

                  Comment

                  • tuban
                    Senior Member
                    Zabbix Certified Specialist
                    • Sep 2012
                    • 286

                    #114
                    После обновления с 2.2.5, до 2.4.0 перестали определятся интерфейсы. Сам по себе скрипт отрабатывает. Не могу понять в чём дело.

                    Возможно, проблема в том, что выводятся ошибки mib? Не могу сообразить, как это отключить. В snmpwalk это делалость через ключи -Ln.
                    Last edited by tuban; 02-10-2014, 05:49.

                    Comment

                    • tuban
                      Senior Member
                      Zabbix Certified Specialist
                      • Sep 2012
                      • 286

                      #115
                      Originally posted by tuban
                      После обновления с 2.2.5, до 2.4.0 перестали определятся интерфейсы. Сам по себе скрипт отрабатывает. Не могу понять в чём дело.

                      Возможно, проблема в том, что выводятся ошибки mib? Не могу сообразить, как это отключить. В snmpwalk это делалость через ключи -Ln.
                      Проблема решена. В MiB файлах были ошибки, которые выводились в вывод скрипта. Чтобы этого избежать, сделали вот так:
                      Code:
                      use SNMP;
                      use IO::Handle;
                      use POSIX qw(strftime);
                      open ERROR,  '>', "/dev/null"  or die $!;
                      STDERR->fdopen( \*ERROR,  'w' ) or die $!;

                      Comment

                      • Jimson
                        Senior Member
                        • Jan 2008
                        • 1327

                        #116
                        Достаточно сделать close STDERR, но проблема в данном случае в том что zabbix должен игнорировать stderr для external check и userparameters. Стоило бы зарепортить.

                        P.S. на сколько я понимаю можно отключить парсинг мибов, добавив в начало скрипта
                        $SNMP::auto_init_mib = 0;
                        проверьте, если будет желание
                        Last edited by Jimson; 02-10-2014, 10:58.

                        Comment

                        • tuban
                          Senior Member
                          Zabbix Certified Specialist
                          • Sep 2012
                          • 286

                          #117
                          Originally posted by Jimson
                          Достаточно сделать close STDERR, но проблема в данном случае в том что zabbix должен игнорировать stderr для external check и userparameters. Стоило бы зарепортить.

                          P.S. на сколько я понимаю можно отключить парсинг мибов, добавив в начало скрипта
                          $SNMP::auto_init_mib = 0;
                          проверьте, если будет желание
                          Хорошо, завтра посмотрю.
                          Самое интересное, в 2.2.5 такой проблемы не было. Видимо стоит создать баг-репорт.

                          Хотя, zabbix могли бы уже давно добавить в LLD возможность добавления нескольких oid, сделали же несколько макросов.

                          Comment

                          • Jimson
                            Senior Member
                            • Jan 2008
                            • 1327

                            #118
                            Originally posted by tuban
                            Хотя, zabbix могли бы уже давно добавить в LLD возможность добавления нескольких oid, сделали же несколько макросов.
                            Что бы подобную логику, с учетом фильтров, реализовать универсально надо такого понаписать... Не думаю что это реально, и считаю это потерей времени и ресурсов, скрипты в качестве lld discovery правила самое то.

                            Comment

                            • tuban
                              Senior Member
                              Zabbix Certified Specialist
                              • Sep 2012
                              • 286

                              #119
                              Originally posted by jimson
                              Достаточно сделать close stderr, но проблема в данном случае в том что zabbix должен игнорировать stderr для external check и userparameters. Стоило бы зарепортить.

                              P.s. на сколько я понимаю можно отключить парсинг мибов, добавив в начало скрипта
                              $snmp::auto_init_mib = 0;
                              проверьте, если будет желание
                              Проверил. Отключить не вышло.

                              Comment

                              • izuchator
                                Junior Member
                                • Mar 2014
                                • 17

                                #120
                                Originally posted by Jimson
                                Ну я уже писал как я решил эту проблему, и собственно тред этому и посвящен. Прилепил еще раз скрипт через который дискаверить интерфейсы, фильтр при этом делается на {#IFTAGS}, например,

                                фильтр ",AdminStatus:up," даст только интерфейсы которые административно включены
                                фильтр ",FLAG," даст только те интерфейс у которых в дескрипшене есть шаблон (метка), которую мы указываем при выхове скрипта - как раз то что вам нужно
                                можно так же фильтровать по типу интерфейса, а так же есть флаг по которому можно отфильтровать "физические" интерфейсы и интерфейсы для которых доступны 64 бит счетчики

                                при этом, использование такого скрипта дает возможность пользовать имя интерфейса {#IFDESCR} и в тоже время алиас, если очень уж нужно - {#IFALIAS}

                                ну и шаблон до кучи приложил
                                скачал скрипт, пробую его выполнить
                                получаю:

                                sudo su -c "/home/cisco_ifindex.pl.txt 10.x.x.x 161 comm" zabbix
                                Can't locate SNMP.pm in @INC (you may need to install the SNMP module) (@INC contains: /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at /home/cisco_ifindex.pl.txt line 5.

                                чего не хватает?

                                Comment

                                Working...