Ad Widget
Collapse
Расширяем snmp lld скриптами
Collapse
X
-
ассоциативный массив, в перле обычно называют 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
-
Я буквально на днях (на предыдущей странице где то) отвечал на просьбу добавить в выборку IP адреса интерфейсов. Сделате diff между оригинальным скриптом и тем что я сделал с IP адресами, это и будет тот код которым можно подкостылить вашу проблему, только OID поменяете и обработку данных полученных с этого OID: возьмете откуда надо индекс и положите куда надо дескрипшен, можно в тот же {ALIAS}, а можно и новый "макрос" добавить.
Вроде кто то переписывал этот скрипт на питоне, не помню было это в этой же теме или в другой. Но я это вспомнил по другому поводу - знать либо перл либо питон, имхо, обязательно для админа (sh, awk, sed, etc это само собой), иначе это какой то ад и Израэль, а не админство
P.S. с подобными "дескрипшенами" сталкивался на мотороловских железках, там тоже "port0", "port1".Comment
-
На текщем сервере это невозможно. Там все запущено (не в смысле работает, а в смысле бардак), и обновлять что-либо - большой риск. Я сейчас в процессе переноса заббикса 2.2 на выделеный сервер и на актуальный релиз. Там уже постараюсь сделать правильно.
Я попробую просто подменить SNMP.pm, посмотрим, что получится. И NetSNMP/default_store.pm, наверное.
Да, спасибо, все получилось.
Теперь вылезла еще такая штука. Вот в этой части:
Я для экпериментов убирал ifDescr отсюда, и получал полный перечень интерфейсов. Сейчас, когда вернул ifDescr, получаю вот такое: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});
Первая переменная - это ifInOctets, вторая - ifDescr. Т.е. полный перечень интерфейсов не получается. Это Mikrotik так себя ведет. Cisco отвечает нормально, например. При этом, если получение разделить на два этапа: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' );
то все отрабатывает корректно. Это уже похоже на глюк конкретной железки. Увеличение max-repeaters не помогает. Так что слегка костылями подпирать все равно придется.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});
Comment
-
Похоже на проблемы с запросом нескольких 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
-
Я, похоже, не совсем ясно выразился, прошу прощения. Максимальное допустимое значение для max-repeaters было 50. Но этого все равно не хватало на то, чтоб вернуть ifInOctets и ifDescr для 14 интерфейсов (из которых два виртуальных). В примере выше max-repeaters как-раз 50. Выше ставить не дает. При дефолтном 10 - возвращает на два элемента меньше. Т.е. не 7 элементов в первом массиве, а 5.Comment
-
Все интерфейсов 7? Или откуда тогда цифра 7 берется?
При 10, bulkwalk должен вернуть 10 * кол-во запрошенных OID, если он возвращает меньше то последние "кол-во запрошенных OID" должны отличаться от фактически запрошенных, ну т.е. закончилась ветка.
Любое другое поведение это глюки.
Или ты хочешь сказать что на bulkwalk микротик может отдать до 50 значений, то если запрашивать bulkwalk по двум OID сразу то он становится раком? Ну в таком случае опять же виноват микротик, в этом случае придется тебе поправить скрипт и запускать bulkwalk отдельно на каждый OID. Если на то пошло, то это LLD правило, и спешить там совершенно некуда.Comment
-
Не знаю, откуда 7, но всего интерфейсов 14, я там писал чуть выше. Возвращает он 7 штук, нечетные - 1, 3, 5, 7, 9, 11, 13.
Больше всего на это как-раз и похоже.
Уже так и сделал.Comment
-
-
Добрый день
Не мог ли бы вы поделитесь, пожалуйста, скриптом на Python.Я на python переписал ваш скрипт используя модуль pysnmp и json, но возникла проблема... Вы сделали в шаблоне несколько правил discovery в зависимости от разрядности счётчиков counter32 и counter64
У меня нет устройства без counter64 чтобы проверить как отрабатывает выбор по регулярным выражениям...Last edited by jonnywallker; 20-07-2015, 08:31.Comment
-
Написал скрипт, который возвращает статистику 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
-
Ссылаться на скрипт нужно в правиле обнаружения (хоть шаблонном, хоть хостовом).
Если скрипт на лежит на хосте с Zabbix-сервером, то Type: External check
В случае использования скрипта удаленно, через UserParams агента - Type: Zabbix agent.Comment
-
А в элементах данных что будет?Comment
-
В смысле - какой тип? Тот, что обеспечивает получение параметров - агент, 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
-
tuban просто намекает что LLD правило это описание данных, а не сами данные. А у DeeZ в JSON походу и то и другое. Подозреваю что данные это {DNSCOUNT}, и не думаю что эти данные удобно будет получать внешней проверкой, тут скорее траппер надо использовать.Comment
Comment