Ad Widget

Collapse

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

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Jimson
    Senior Member
    • Jan 2008
    • 1327

    #121
    Originally posted by izuchator
    Can't locate SNMP.pm
    чего не хватает?
    перловых модулей из комплекта net-snmp.

    Comment

    • izuchator
      Junior Member
      • Mar 2014
      • 17

      #122
      Originally posted by Jimson
      перловых модулей из комплекта net-snmp.

      подскажите, что надо установить я не очень в этом разбираюсь)
      по форумам смотрел
      sudo perl -MCPAN -e 'install Net::SNMP'
      .....
      ./Build install -- OK
      ошибка сохраняется.
      или это не то?

      Comment

      • izuchator
        Junior Member
        • Mar 2014
        • 17

        #123
        одну проблему решил)
        установил apt-get install libsnmp-perl

        теперь другая проблема)

        sudo su -c "/home/cisco_ifindex.pl.txt 10.*.*.* 161 comm" zabbix
        Created directory: /var/lib/snmp/mib_indexes
        Unknown user name at /home/cisco_ifindex.pl.txt line 27.
        что за юзер ей не нравиться?))
        Code:
        #!/usr/bin/perl -w
        
        $TAGSEP = ",";
        
        use SNMP;
        
        die "Usage: $0 <host> <port> <community>" if ($#ARGV < 2);
        
        $sess = new SNMP::Session(DestHost => "$ARGV[0]:$ARGV[1]",
        		Community => "$ARGV[2]",
        		UseNumeric => 1,
        		NonIncreasing => 1,
        		UseLongNames => 1);
        
        die $sess->{ErrorStr} if ($sess->{ErrorNum});
        
        ($ifInOctets, $ifDescr, $ifType, $ifAdmin, $ifInErrors, $ifHCInOctets, $ifAlias) = $sess->bulkwalk(0, 500, [
        	['.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.3'],
        	['.1.3.6.1.2.1.2.2.1.7'],
        	['.1.3.6.1.2.1.2.2.1.14'],
        	['.1.3.6.1.2.1.31.1.1.1.6'],
        	['.1.3.6.1.2.1.31.1.1.1.18']
        	]);
        
        die $sess->{ErrorStr} if ($sess->{ErrorNum});
        
        for $i (0..$#$ifInOctets) {
        	$json{ $$ifInOctets[$i]->iid } = {};
        }
        for $i (0..$#$ifDescr) {
        	if (exists( $json{ $$ifDescr[$i]->iid } )) {
        		$json{ $$ifDescr[$i]->iid }->{IFDESCR} = $$ifDescr[$i]->val;
        		$json{ $$ifDescr[$i]->iid }->{IFTAGS} = $TAGSEP . $$ifDescr[$i]->val . $TAGSEP;
        	}
        }
        for $i (keys %json) {
        	delete $json{$i} unless (exists( $json{$i}->{IFDESCR} ));
        }
        
        for $i (0..$#$ifType) {
        	if (exists( $json{ $$ifType[$i]->iid } )) {
        		$json{ $$ifType[$i]->iid }->{IFTAGS} .= "Type:" . $$ifType[$i]->val . $TAGSEP;
        	}
        }
        for $i (0..$#$ifAdmin) {
        	if (exists( $json{ $$ifAdmin[$i]->iid } )) {
        		$json{ $$ifAdmin[$i]->iid }->{IFTAGS} .= "AdminStatus:" . (
        			$$ifAdmin[$i]->val == 1 ? "up" :
        			$$ifAdmin[$i]->val == 2 ? "down" :
        			$$ifAdmin[$i]->val == 3 ? "testing" : $$ifAdmin[$i]->val ) . $TAGSEP
        	}
        }
        for $i (0..$#$ifInErrors) {
        	if (exists( $json{ $$ifInErrors[$i]->iid } )) {
        		$json{ $$ifInErrors[$i]->iid }->{IFTAGS} .= "Physical" . $TAGSEP;
        	}
        }
        for $i (0..$#$ifHCInOctets) {
        	if (exists( $json{ $$ifHCInOctets[$i]->iid } )) {
        		$json{ $$ifHCInOctets[$i]->iid }->{IFTAGS} .= "Counter64" . $TAGSEP;
        	}
        }
        for $i (0..$#$ifAlias) {
        	if (exists( $json{ $$ifAlias[$i]->iid } )) {
        		$alias = $$ifAlias[$i]->val;
        		$flag = quotemeta($ARGV[3]) if $ARGV[3];
        		if ($flag and $alias =~ s/^(.*)$flag\s*/$1/o) {
        			$alias =~ s/\s*$//o;
        			$json{ $$ifAlias[$i]->iid }->{IFTAGS} .= "FLAG" . $TAGSEP;
        		}
        		$json{ $$ifAlias[$i]->iid }->{IFALIAS} = $alias;
        	}
        }
        
        #
        # Output in JSON format
        #
        print "{\"data\":[";
        $first_data = 1;
        while (($index, $data) = each %json) {
        	$first_data ? $first_data = 0 : print ",";
        	print "\n{\"{#IFINDEX}\":\"", $index, "\"";
        	while (($macro, $value) = each %$data) {
        		print ",\"{#", $macro, "}\":\"", $value, "\"";
        	}
        	print "}";
        }
        print "]}\n";
        Last edited by izuchator; 13-01-2015, 06:26.

        Comment

        • Jimson
          Senior Member
          • Jan 2008
          • 1327

          #124
          Originally posted by izuchator
          подскажите, что надо установить я не очень в этом разбираюсь)
          Я тем более не разбираюсь в вашем дистрибутиве. net-snmp это C библиотеки и утилиты, а так же модули Perl, Python и какая то фигня на Tcl. Каким образом и кто собирал в вашем дистрибутиве net-snmp мне не ведомо. Ставить из cpan эти модули не стоит.

          Comment

          • izuchator
            Junior Member
            • Mar 2014
            • 17

            #125
            Originally posted by Jimson
            "Unknown user name" в виде SNMP ошибки намекает что скрипт пытается лезть по SNMPv3, а сессию выше мы создает только с указанием комьюнити, т.е. только под SNMPv1 и SNMPv2c.

            Если вам нужно работать по SNMPv3 то надо поправить скрипт, передавать в него не комьюнити, а юзеров, пароли и что там еще нужно, соответсвенно если кол-во параметров увелится то ниже по тексту так же надо будет сдвинуть индексы в списке @ARGV.
            мне не нужен SNMPv3, что где изменить нужно для использования SNMPv1 и SNMPv2c?

            Comment

            • sadman
              Senior Member
              • Dec 2010
              • 1611

              #126
              Originally posted by izuchator
              мне не нужен SNMPv3, что где изменить нужно для использования SNMPv1 и SNMPv2c?
              Думаю, что стоит явно задать версию протокола snmp при создании экземпляра, если опираться на это:
              Version
              default taken from library configuration - probably 3 [1, 2 (same as 2c), 2c, 3]

              Comment

              • izuchator
                Junior Member
                • Mar 2014
                • 17

                #127
                спс, заработало
                буду пробовать прикрутить к забиксу)
                Last edited by izuchator; 13-01-2015, 10:40.

                Comment

                • Jimson
                  Senior Member
                  • Jan 2008
                  • 1327

                  #128
                  Написано же жирным: Update 2. Актуальная версия скрипта, шаблона и regexp в посте 46
                  Зачем вы мучаете старый скрипт?

                  P.S. еще нужно прочитать вот это: https://www.zabbix.com/forum/showpos...8&postcount=87

                  Comment

                  • izuchator
                    Junior Member
                    • Mar 2014
                    • 17

                    #129
                    скопировал скрипт и импортировал шаблон, фильтры в шаблоне выставил в 0, регулярные выражения добавил. Повесил шаблон на узел но ничего не происходит, из командной строки работает. Может я что-то просмотрел?)
                    Last edited by izuchator; 14-01-2015, 05:20.

                    Comment

                    • Jimson
                      Senior Member
                      • Jan 2008
                      • 1327

                      #130
                      Originally posted by izuchator
                      спс) прочитал
                      только изучаю и поэтому еще очень туго понимаю
                      возникли вопросы
                      если мне не нужен {$MPLS_VRF_RD} то его значение выставляем = 0?
                      фильтр указывать в макросе {$LLD_IF_REGEX}? и как отфильтровать все интерфейсы в состоянии up и тип 6
                      Он и так 0, по умолчанию. Это тоже там написано.
                      LLD_IF_REGEX это обычный perl regex, можно использовать все доступные возможности. AdminStatus проверяется в zabbix regex, пример есть на картинке, а отфильтровать "тип 6" можно с помощью
                      Code:
                      {#LLD_IF_REGEX}=,Type:6,
                      . OperStatus скрипт не анализирует вообще, использовать его для фильтрации, мягко говоря, не правильно.

                      Comment

                      • izuchator
                        Junior Member
                        • Mar 2014
                        • 17

                        #131
                        Originally posted by jimson
                        Он и так 0, по умолчанию. Это тоже там написано.
                        Lld_if_regex это обычный perl regex, можно использовать все доступные возможности. Adminstatus проверяется в zabbix regex, пример есть на картинке, а отфильтровать "тип 6" можно с помощью
                        Code:
                        {#lld_if_regex}=,type:6,
                        . Operstatus скрипт не анализирует вообще, использовать его для фильтрации, мягко говоря, не правильно.
                        скопировал скрипт и импортировал шаблон, фильтр{$mpls_vrf_rd} в шаблоне выставил = 0(был =[d]), регулярные выражения добавил. Повесил шаблон на узел, но ничего не происходит, из командной строки работает. Может я что-то просмотрел?)
                        как проверить что скрипт работает из забикса?

                        Comment

                        • Jimson
                          Senior Member
                          • Jan 2008
                          • 1327

                          #132
                          '[d]' значение по умолчанию для {$LLD_IF_FLAG}, а {$MPLS_VRF_RD} и так по умолчанию 0 (undef). Прочитайте еще раз пост, там же все подробно расписано, в том числе для чего используется "FLAG".

                          По "ничего не происходит" нельзя ничего сказать. Может оно и работает, просто интервал дискаверинга в моем шаблоне стоит 3 часа, если я правильно помню. Включите отладку в zabbix, или добавьте отладку в скрипт. Мне отсюда не видно что у вас сконфигурировано, настройка LLD требует аккуратности.
                          Last edited by Jimson; 14-01-2015, 10:19.

                          Comment

                          • izuchator
                            Junior Member
                            • Mar 2014
                            • 17

                            #133
                            Никак не получу результат.
                            Code:
                            19679:20150115:132334.014 In substitute_key_macros() data:'cisco_ifmib.pl[{HOST.CONN},{$SNMP_PORT},{$SNMP_COMMUNITY},{$MPLS_VRF_RD},{$LLD_IF_FLAG},{$LLD_IF_REGEX},PHY]'
                             19679:20150115:132334.014 In substitute_simple_macros() data:'{HOST.CONN}'
                             19679:20150115:132334.014 End substitute_simple_macros() data:'10.*.*.*'
                             19679:20150115:132334.014 In substitute_simple_macros() data:'{$SNMP_PORT}'
                             19679:20150115:132334.014 In DCget_user_macro() macro:'{$SNMP_PORT}'
                             19679:20150115:132334.014 In DCget_host_macro() macro:'{$SNMP_PORT}'
                             19679:20150115:132334.014 In DCget_host_macro() macro:'{$SNMP_PORT}'
                             19679:20150115:132334.014 End of DCget_host_macro():FAIL
                             19679:20150115:132334.014 End of DCget_host_macro():FAIL
                             19679:20150115:132334.014 In DCget_global_macro() macro:'{$SNMP_PORT}'
                             19679:20150115:132334.014 End of DCget_global_macro()
                             19679:20150115:132334.014 End of DCget_user_macro()
                             19679:20150115:132334.014 End substitute_simple_macros() data:'161'
                             19679:20150115:132334.014 In substitute_simple_macros() data:'{$SNMP_COMMUNITY}'
                             19679:20150115:132334.014 In DCget_user_macro() macro:'{$SNMP_COMMUNITY}'
                             19679:20150115:132334.014 In DCget_host_macro() macro:'{$SNMP_COMMUNITY}'
                             19679:20150115:132334.014 In DCget_host_macro() macro:'{$SNMP_COMMUNITY}'
                             19684:20150115:132334.014 poller #30 [got 0 values in 0.000228 sec, getting values]
                             19679:20150115:132334.014 End of DCget_host_macro():FAIL
                             19679:20150115:132334.014 End of DCget_host_macro():FAIL
                             19684:20150115:132334.014 In get_values()
                             19679:20150115:132334.014 In DCget_global_macro() macro:'{$SNMP_COMMUNITY}'
                             19684:20150115:132334.014 In DCconfig_get_poller_items() poller_type:0
                             19679:20150115:132334.014 End of DCget_global_macro()
                             19679:20150115:132334.014 End of DCget_user_macro()
                             19679:20150115:132334.015 End substitute_simple_macros() data:'COMM'
                             19684:20150115:132334.015 End of DCconfig_get_poller_items():0
                             19679:20150115:132334.015 In substitute_simple_macros() data:'{$MPLS_VRF_RD}'
                             19684:20150115:132334.015 End of get_values():0
                             19679:20150115:132334.015 In DCget_user_macro() macro:'{$MPLS_VRF_RD}'
                             19684:20150115:132334.015 In DCconfig_get_poller_nextcheck() poller_type:0
                             19679:20150115:132334.015 In DCget_host_macro() macro:'{$MPLS_VRF_RD}'
                             19679:20150115:132334.015 In DCget_host_macro() macro:'{$MPLS_VRF_RD}'
                             19679:20150115:132334.015 End of DCget_host_macro():SUCCEED
                             19679:20150115:132334.015 End of DCget_host_macro():SUCCEED
                             19679:20150115:132334.015 End of DCget_user_macro()
                             19679:20150115:132334.015 End substitute_simple_macros() data:'0'
                             19679:20150115:132334.015 In substitute_simple_macros() data:'{$LLD_IF_FLAG}'
                             19684:20150115:132334.015 End of DCconfig_get_poller_nextcheck():1421310272
                             19679:20150115:132334.015 In DCget_user_macro() macro:'{$LLD_IF_FLAG}'
                             19679:20150115:132334.015 In DCget_host_macro() macro:'{$LLD_IF_FLAG}'
                             19684:20150115:132334.015 poller #30 [got 0 values in 0.000172 sec, idle 5 sec]
                             19679:20150115:132334.015 In DCget_host_macro() macro:'{$LLD_IF_FLAG}'
                             19679:20150115:132334.015 End of DCget_host_macro():SUCCEED
                             19679:20150115:132334.015 End of DCget_host_macro():SUCCEED
                             19679:20150115:132334.015 End of DCget_user_macro()
                             19679:20150115:132334.015 End substitute_simple_macros() data:'0'
                             19679:20150115:132334.015 In substitute_simple_macros() data:'{$LLD_IF_REGEX}'
                             19679:20150115:132334.015 In DCget_user_macro() macro:'{$LLD_IF_REGEX}'
                             19679:20150115:132334.015 In DCget_host_macro() macro:'{$LLD_IF_REGEX}'
                             19679:20150115:132334.015 In DCget_host_macro() macro:'{$LLD_IF_REGEX}'
                             19679:20150115:132334.015 End of DCget_host_macro():SUCCEED
                             19679:20150115:132334.015 End of DCget_host_macro():SUCCEED
                             19679:20150115:132334.015 End of DCget_user_macro()
                             19679:20150115:132334.015 End substitute_simple_macros() data:'0'
                             19679:20150115:132334.015 End of substitute_key_macros():SUCCEED data:'cisco_ifmib.pl[10.*.*.*,161,COMM,0,0,0,PHY]'
                             19679:20150115:132334.015 In get_value() key:'cisco_ifmib.pl[{HOST.CONN},{$SNMP_PORT},{$SNMP_COMMUNITY},{$MPLS_VRF_RD},{$LLD_IF_FLAG},{$LLD_IF_REGEX},PHY]'
                             19679:20150115:132334.015 In get_value_external() key:'cisco_ifmib.pl[{HOST.CONN},{$SNMP_PORT},{$SNMP_COMMUNITY},{$MPLS_VRF_RD},{$LLD_IF_FLAG},{$LLD_IF_REGEX},PHY]'
                             19679:20150115:132334.015 In zbx_popen() command:'/cisco_ifmib.pl "10.*.*.*" "161" "COMM" "0" "0" "0" "PHY"'
                            есть еще такие сообщения

                            Code:
                            In zbx_waitpid()
                            zbx_waitpid() exited, status:0
                            End of zbx_waitpid():466
                            End of get_value_external():SUCCEED
                            End of get_value():SUCCEED
                            In activate_host() hostid:10821 itemid:395552 type:10
                            End of activate_host()
                            In lld_process_discovery_rule() itemid:395552
                            query [txnlev:0] [select hostid,key_,state,evaltype,formula,error,lifetime from items where itemid=395552]
                            In substitute_simple_macros() data:'365'
                            query [txnlev:0] [select item_conditionid,macro,value from item_condition where itemid=395552]
                            In lld_rows_get()
                            End of lld_rows_get():FAIL
                            End of lld_process_discovery_rule()
                            End of get_values():1
                            Last edited by izuchator; 15-01-2015, 11:08.

                            Comment

                            • Jimson
                              Senior Member
                              • Jan 2008
                              • 1327

                              #134
                              Вот результат постановок:
                              In zbx_popen() command:'/cisco_ifmib.pl "10.*.*.*" "161" "COMM" "0" "0" "0" "PHY"'
                              Запускайте ручками и смотрите что получается (звездочки это вы специально поставили, скрываете private адрес?).
                              Опять же, если у вас элемент-правило с ошибкой пулится, то это вероятнее всего проблемы запуска скрипта из под окружения zabbix_server, например, переменные окружения, ограничения вроде selinux и т.п. Если же ошибки нет, но и элементы не создаются, значит ошибка в конфигурации правила, скорее всего в "фильтре".

                              Comment

                              • izuchator
                                Junior Member
                                • Mar 2014
                                • 17

                                #135
                                проблема решилась маленьким переделыванием скрипта, убрана последняя запитая в JSON после чего все заработало.
                                Code:
                                my $i = 0 ;
                                while (($index, $data) = each %json) {
                                    if ($i) { print ",";}
                                    $i += 1;
                                    print '{"{#IFINDEX}":"', $index, '"';
                                    while (($macro, $value) = each %$data) {
                                        print ',"{#', $macro, '}":"', $value, '"';
                                    }
                                    print "}";

                                Comment

                                Working...