Ad Widget
Collapse
Расширяем snmp lld скриптами
Collapse
X
-
В строке просто добавлен регексп, вырезающий кавычки, если таковые встречаются. Скрипт для себя писал, многие проверки не учтены, чинил только то, с чем сталкивался у себя на оборудовании. По хорошему сделать свой регексп, убирающий все спецсимволы из выводов на этапе формирования, но это надо думать и отлаживать.
Еще из скрипта можно убрать часть
ее смысл в том что если третим параметром передать скрипту 1, то из вывода убирутся виртуальные интерфейсы, писал для цисковских брасов, без этого интерфейсов выходит несколько десятков тысяч, но в вашем случае этот кусок кода врядли нужен, также убрать fi после строки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
саму строку оставить.Code:grep -E "Type:(6|117|161)" $tmp/ifJSON.$fl | sed -e '$s/,$//'
Comment
-
Для Juniper-ов это не работает, скрипт помечает все интерфейсы как физические. Я тупо беру интерфейсы, в имени которых нет точки, для Джуниперов и цисок должно работать.Для физических интерфейсов у меня есть отдельный "тэг" - 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.Comment
-
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 #
Из-за того что LinkSys возвращает: Ethernet InterfaceCode:# 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
скрипт не возвращает имена интерфейсов, еще смотрю они дублируются в ifName, может как-то можно по ifName определять?Comment
-
Ну изменить 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
-
Я вот сподобился переделать это все под trapper. Скрипт сильно покорежен - плохо знаю программирование. Буду благодарен за все правки. В самом скрипте я отфильтровываю интерфейсы, специфичные для JunOS.
Очень полезно, когда несколько десятков тысяч интерфейсов.
Нужен модуль перла Zabbix::Sender последней версии, в предпоследней баг с размером данных.Attached FilesComment
-
Если по теме пройтись, то тут будет информация о задваивании. Это касается только определенных версий забикса.
Вот так и нету не каких задваиваний в последних версиях.
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});
Актуально для Linksys где вместо имени интерфейса прилетает что это просто Ethernet address, тогда это поле заполняется из ifName.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; } } }Comment
-
После обновления с 2.2.5, до 2.4.0 перестали определятся интерфейсы. Сам по себе скрипт отрабатывает. Не могу понять в чём дело.
Возможно, проблема в том, что выводятся ошибки mib? Не могу сообразить, как это отключить. В snmpwalk это делалость через ключи -Ln.Last edited by tuban; 02-10-2014, 05:49.Comment
-
Проблема решена. В MiB файлах были ошибки, которые выводились в вывод скрипта. Чтобы этого избежать, сделали вот так:
Code:use SNMP; use IO::Handle; use POSIX qw(strftime); open ERROR, '>', "/dev/null" or die $!; STDERR->fdopen( \*ERROR, 'w' ) or die $!;
Comment
-
Достаточно сделать close STDERR, но проблема в данном случае в том что zabbix должен игнорировать stderr для external check и userparameters. Стоило бы зарепортить.
P.S. на сколько я понимаю можно отключить парсинг мибов, добавив в начало скрипта
$SNMP::auto_init_mib = 0;
проверьте, если будет желаниеLast edited by Jimson; 02-10-2014, 10:58.Comment
-
Хорошо, завтра посмотрю.Достаточно сделать close STDERR, но проблема в данном случае в том что zabbix должен игнорировать stderr для external check и userparameters. Стоило бы зарепортить.
P.S. на сколько я понимаю можно отключить парсинг мибов, добавив в начало скрипта
$SNMP::auto_init_mib = 0;
проверьте, если будет желание
Самое интересное, в 2.2.5 такой проблемы не было. Видимо стоит создать баг-репорт.
Хотя, zabbix могли бы уже давно добавить в LLD возможность добавления нескольких oid, сделали же несколько макросов.
Comment
-
Что бы подобную логику, с учетом фильтров, реализовать универсально надо такого понаписать... Не думаю что это реально, и считаю это потерей времени и ресурсов, скрипты в качестве lld discovery правила самое то.Comment
-
Проверил. Отключить не вышло.Достаточно сделать close stderr, но проблема в данном случае в том что zabbix должен игнорировать stderr для external check и userparameters. Стоило бы зарепортить.
P.s. на сколько я понимаю можно отключить парсинг мибов, добавив в начало скрипта
$snmp::auto_init_mib = 0;
проверьте, если будет желаниеComment
-
скачал скрипт, пробую его выполнитьНу я уже писал как я решил эту проблему, и собственно тред этому и посвящен. Прилепил еще раз скрипт через который дискаверить интерфейсы, фильтр при этом делается на {#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
Comment