Ad Widget

Collapse

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

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Jeko
    Junior Member
    • Dec 2014
    • 9

    #181
    Originally posted by Jimson
    Это что за железо такое? ifAlias другим быть не может, это OID из таблицы ifXTable (.1.3.6.1.2.1.31), ваш OID это какой то "vendor specific".
    Ну а подправить, подправить все можно, код простой, к тому же вас никто не покусает в процессе правки, подставляйте другие OID, выкусывайте "INDEX" не из $_->iid, а из $_->name с помощью substr, или split.
    Железка - DLINK DGS-1100-10/ME. По стандартному oid отдаются значения Slot0/1, Slot0/2 и т.п. С перлом не особо дружу, но попробую разобраться))

    Comment

    • Jimson
      Senior Member
      • Jan 2008
      • 1327

      #182
      Originally posted by blah.blah
      так и не определил ее тип
      ассоциативный массив, в перле обычно называют hash
      если %hash это хэш, то $hash{$var} это значение по ключу $var

      Что касается вашего вопроса... Это глюки/баги netsnmp, она должна была разобрать oid на tag+iid, почему этого не происходит сказать трудно. От агента это явно не зависит. Попробуйте обновить net-snmp и его перловую библиотеку.

      P.S. сидеть выкусывать index ручками можно, например, так:

      for (@$ifInOctets) {
      my $iid = $_->iid;
      ($iid) = $_->tag =~ /\.(\d+)$/ unless $iid;
      $json{ $iid } = {} if $_->val =~ /^\d+$/;
      }

      Но проблема с $_->iid у вас явно коснется всех выборок и заниматься этим извращением придется везде где идут обращения к SNMP::Varbind::iid. Это бага, правильнее все же ее исправить, а не подкостыливать.

      Comment

      • Jimson
        Senior Member
        • Jan 2008
        • 1327

        #183
        Originally posted by Jeko
        Железка - DLINK DGS-1100-10/ME. По стандартному oid отдаются значения Slot0/1, Slot0/2 и т.п. С перлом не особо дружу, но попробую разобраться))
        Я буквально на днях (на предыдущей странице где то) отвечал на просьбу добавить в выборку IP адреса интерфейсов. Сделате diff между оригинальным скриптом и тем что я сделал с IP адресами, это и будет тот код которым можно подкостылить вашу проблему, только OID поменяете и обработку данных полученных с этого OID: возьмете откуда надо индекс и положите куда надо дескрипшен, можно в тот же {ALIAS}, а можно и новый "макрос" добавить.

        Вроде кто то переписывал этот скрипт на питоне, не помню было это в этой же теме или в другой. Но я это вспомнил по другому поводу - знать либо перл либо питон, имхо, обязательно для админа (sh, awk, sed, etc это само собой), иначе это какой то ад и Израэль, а не админство

        P.S. с подобными "дескрипшенами" сталкивался на мотороловских железках, там тоже "port0", "port1".

        Comment

        • blah.blah
          Junior Member
          • Mar 2015
          • 19

          #184
          Originally posted by Jimson
          Попробуйте обновить net-snmp и его перловую библиотеку.
          На текщем сервере это невозможно. Там все запущено (не в смысле работает, а в смысле бардак), и обновлять что-либо - большой риск. Я сейчас в процессе переноса заббикса 2.2 на выделеный сервер и на актуальный релиз. Там уже постараюсь сделать правильно.
          Я попробую просто подменить SNMP.pm, посмотрим, что получится. И NetSNMP/default_store.pm, наверное.
          Originally posted by Jimson
          P.S. сидеть выкусывать index ручками можно, например, так
          Да, спасибо, все получилось.
          Теперь вылезла еще такая штука. Вот в этой части:
          Code:
              ($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']]);
              error('bulkwalk [ifInOctets, ifDescr]', $sess->{ErrorStr}) if ($sess->{ErrorNum});
          Я для экпериментов убирал ifDescr отсюда, и получал полный перечень интерфейсов. Сейчас, когда вернул ifDescr, получаю вот такое:
          Code:
          $VAR1 = bless( [
                           bless( [
                                    'iso.3.6.1.2.1.2.2.1.10.1',
                                    '',
                                    '0',
                                    'COUNTER'
                                  ], 'SNMP::Varbind' ),
                           bless( [
                                    'iso.3.6.1.2.1.2.2.1.10.3',
                                    '',
                                    '3253816086',
                                    'COUNTER'
                                  ], 'SNMP::Varbind' ),
                           bless( [
                                    'iso.3.6.1.2.1.2.2.1.10.5',
                                    '',
                                    '0',
                                    'COUNTER'
                                  ], 'SNMP::Varbind' ),
                           bless( [
                                    'iso.3.6.1.2.1.2.2.1.10.7',
                                    '',
                                    '2595819702',
                                    'COUNTER'
                                  ], 'SNMP::Varbind' ),
                           bless( [
                                    'iso.3.6.1.2.1.2.2.1.10.9',
                                    '',
                                    '0',
                                    'COUNTER'
                                  ], 'SNMP::Varbind' ),
                           bless( [
                                    'iso.3.6.1.2.1.2.2.1.10.11',
                                    '',
                                    '0',
                                    'COUNTER'
                                  ], 'SNMP::Varbind' ),
                           bless( [
                                    'iso.3.6.1.2.1.2.2.1.10.13',
                                    '',
                                    '203497558',
                                    'COUNTER'
                                  ], 'SNMP::Varbind' )
                         ], 'SNMP::VarList' );
          $VAR1 = bless( [], 'SNMP::VarList' );
          Первая переменная - это ifInOctets, вторая - ifDescr. Т.е. полный перечень интерфейсов не получается. Это Mikrotik так себя ведет. Cisco отвечает нормально, например. При этом, если получение разделить на два этапа:
          Code:
              ($ifInOctets) = $sess->bulkwalk(0, 10, ['.1.3.6.1.2.1.2.2.1.10']);
              error('bulkwalk [ifInOctets]', $sess->{ErrorStr}) if ($sess->{ErrorNum});
          
              ($ifDescr) = $sess->bulkwalk(0, 10, ['.1.3.6.1.2.1.2.2.1.2']);
              error('bulkwalk [ifDescr]', $sess->{ErrorStr}) if ($sess->{ErrorNum});
          то все отрабатывает корректно. Это уже похоже на глюк конкретной железки. Увеличение max-repeaters не помогает. Так что слегка костылями подпирать все равно придется.

          Comment

          • Jimson
            Senior Member
            • Jan 2008
            • 1327

            #185
            Похоже на проблемы с запросом нескольких OID в одном get(), вот это
            ($ifType, $ifAdmin, $ifInErrors) = $sess->bulkwalk(0, 10, [['.1.3.6.1.2.1.2.2.1.3'],['.1.3.6.1.2.1.2.2.1.7'],['.1.3.6.1.2.1.2.2.1.14']]);
            тоже не отрабатывает и возвращает пустоту?

            Вместо "10" ставь число меньше, до тех пор пока не заработает. Раз у тебя "($ifInOctets) = $sess->bulkwalk(0, 10, ..." работает значит 10 OID в response микротик отдает, а 20 уже нет.

            P.S. микротику надо оторвать что-нибудь, 30 oid на запрос это ну совсем скромно, не отвечать на такие запросы это обычное хамство
            P.P.S. скорее всего твоя проблема изначально с этим связана
            Last edited by Jimson; 19-05-2015, 12:39.

            Comment

            • blah.blah
              Junior Member
              • Mar 2015
              • 19

              #186
              Originally posted by Jimson
              P.S. микротику надо оторвать что-нибудь, 30 oid на запрос это ну совсем скромно, не отвечать на такие запросы это обычное хамство
              Я, похоже, не совсем ясно выразился, прошу прощения. Максимальное допустимое значение для max-repeaters было 50. Но этого все равно не хватало на то, чтоб вернуть ifInOctets и ifDescr для 14 интерфейсов (из которых два виртуальных). В примере выше max-repeaters как-раз 50. Выше ставить не дает. При дефолтном 10 - возвращает на два элемента меньше. Т.е. не 7 элементов в первом массиве, а 5.

              Comment

              • Jimson
                Senior Member
                • Jan 2008
                • 1327

                #187
                Originally posted by blah.blah
                При дефолтном 10 - возвращает на два элемента меньше. Т.е. не 7 элементов в первом массиве, а 5.
                Все интерфейсов 7? Или откуда тогда цифра 7 берется?
                При 10, bulkwalk должен вернуть 10 * кол-во запрошенных OID, если он возвращает меньше то последние "кол-во запрошенных OID" должны отличаться от фактически запрошенных, ну т.е. закончилась ветка.
                Любое другое поведение это глюки.

                Или ты хочешь сказать что на bulkwalk микротик может отдать до 50 значений, то если запрашивать bulkwalk по двум OID сразу то он становится раком? Ну в таком случае опять же виноват микротик, в этом случае придется тебе поправить скрипт и запускать bulkwalk отдельно на каждый OID. Если на то пошло, то это LLD правило, и спешить там совершенно некуда.

                Comment

                • blah.blah
                  Junior Member
                  • Mar 2015
                  • 19

                  #188
                  Originally posted by jimson
                  Все интерфейсов 7? Или откуда тогда цифра 7 берется?
                  Не знаю, откуда 7, но всего интерфейсов 14, я там писал чуть выше. Возвращает он 7 штук, нечетные - 1, 3, 5, 7, 9, 11, 13.
                  Originally posted by jimson
                  Или ты хочешь сказать что на bulkwalk микротик может отдать до 50 значений, то если запрашивать bulkwalk по двум oid сразу то он становится раком?
                  Больше всего на это как-раз и похоже.
                  Originally posted by jimson
                  в этом случае придется тебе поправить скрипт и запускать bulkwalk отдельно на каждый oid. Если на то пошло, то это lld правило, и спешить там совершенно некуда.
                  Уже так и сделал.

                  Comment

                  • NoOneIsPerfect
                    Member
                    • Feb 2015
                    • 37

                    #189
                    Спасибо. Очень дельная разработка. Достойная чтобы её закрепили в топе тредов.

                    Comment

                    • jonnywallker
                      Junior Member
                      • Jul 2015
                      • 1

                      #190
                      Добрый день

                      Originally posted by logicall
                      Я на python переписал ваш скрипт используя модуль pysnmp и json, но возникла проблема... Вы сделали в шаблоне несколько правил discovery в зависимости от разрядности счётчиков counter32 и counter64
                      У меня нет устройства без counter64 чтобы проверить как отрабатывает выбор по регулярным выражениям...
                      Не мог ли бы вы поделитесь, пожалуйста, скриптом на Python.
                      Last edited by jonnywallker; 20-07-2015, 08:31.

                      Comment

                      • DeeZ
                        Member
                        • Aug 2015
                        • 82

                        #191
                        Написал скрипт, который возвращает статистику DNS в json:
                        Code:
                        ./dnsstat.py 
                        {"data":[
                        {"{#DNSINDEX}":"1","{#DNSTAGS}":"1","{#DNSTYPE}":"RESERVED0","{#DNSCOUNT}":"1"},
                        {"{#DNSINDEX}":"2","{#DNSTAGS}":"1","{#DNSTYPE}":"A","{#DNSCOUNT}":"475109365"},
                        {"{#DNSINDEX}":"3","{#DNSTAGS}":"1","{#DNSTYPE}":"NS","{#DNSCOUNT}":"108492"},
                        {"{#DNSINDEX}":"4","{#DNSTAGS}":"1","{#DNSTYPE}":"CNAME","{#DNSCOUNT}":"15853"},
                        {"{#DNSINDEX}":"5","{#DNSTAGS}":"1","{#DNSTYPE}":"SOA","{#DNSCOUNT}":"122191"},
                        {"{#DNSINDEX}":"6","{#DNSTAGS}":"1","{#DNSTYPE}":"PTR","{#DNSCOUNT}":"18579351"},
                        {"{#DNSINDEX}":"7","{#DNSTAGS}":"1","{#DNSTYPE}":"MX","{#DNSCOUNT}":"1723017"},
                        {"{#DNSINDEX}":"8","{#DNSTAGS}":"1","{#DNSTYPE}":"TXT","{#DNSCOUNT}":"1101050"},
                        {"{#DNSINDEX}":"9","{#DNSTAGS}":"1","{#DNSTYPE}":"X25","{#DNSCOUNT}":"1"},
                        {"{#DNSINDEX}":"10","{#DNSTAGS}":"1","{#DNSTYPE}":"AAAA","{#DNSCOUNT}":"12150784"},
                        ]}
                        Но не могу понять как это теперь прикрутить к заббиксу?
                        Мне надо этот скрипт в обнаружение добавлять, или в шаблонах в обнаружение?
                        Можно пример показать, как это делается со скриптом из шапки (думаю дальеш разберусь)

                        Comment

                        • sadman
                          Senior Member
                          • Dec 2010
                          • 1611

                          #192
                          Originally posted by DeeZ
                          Написал скрипт, который возвращает статистику DNS в json:

                          [/CODE]
                          Но не могу понять как это теперь прикрутить к заббиксу?
                          Ссылаться на скрипт нужно в правиле обнаружения (хоть шаблонном, хоть хостовом).
                          Если скрипт на лежит на хосте с Zabbix-сервером, то Type: External check
                          В случае использования скрипта удаленно, через UserParams агента - Type: Zabbix agent.

                          Comment

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

                            #193
                            Originally posted by sadman
                            Ссылаться на скрипт нужно в правиле обнаружения (хоть шаблонном, хоть хостовом).
                            Если скрипт на лежит на хосте с zabbix-сервером, то type: External check
                            В случае использования скрипта удаленно, через userparams агента - type: Zabbix agent.
                            А в элементах данных что будет?

                            Comment

                            • sadman
                              Senior Member
                              • Dec 2010
                              • 1611

                              #194
                              Originally posted by tuban
                              А в элементах данных что будет?
                              В смысле - какой тип? Тот, что обеспечивает получение параметров - агент, snmp, скрипт. Rule обеспечивает макросы для элементов данных, которые генерируются из списка JSON.
                              Например: Type: Zabbix agent; Key: dns.get.count[#DNSTYPE}]
                              После срабатывания Discovery Rule из прототипа создастся 10 элементов данных: dns.get.count[A], dns.get.count[NS], dns.get.count[MX]...

                              Comment

                              • Jimson
                                Senior Member
                                • Jan 2008
                                • 1327

                                #195
                                tuban просто намекает что LLD правило это описание данных, а не сами данные. А у DeeZ в JSON походу и то и другое. Подозреваю что данные это {DNSCOUNT}, и не думаю что эти данные удобно будет получать внешней проверкой, тут скорее траппер надо использовать.

                                Comment

                                Working...