Кто уже пытался использовать LLD заметил что во первых, прохода по одному OID не достаточно для вменяемого дискаверинга, во вторых по куцым результатам этого дискаверинга невозможно сделать нормальную фильтрацию.
Для примера, дискаверинг по интерфейсам дает нам индекс и Descr, а хочется еще
1) тип интерфейса
2) админ статус
3) полный дескрипшен прописанный в конфигурации
4) RD или VRF name, если интерфейс является forwarding
5) и тд и тп
А ведь хочется еще фильтр на это все. Итог: нам нужен JSON в котором кроме всего перечисленного выше еще должен быть {#TAGS} значение которого объединяет важные параметры, по которым мы будем фильтровать, ну например "GigabitEthernet0/2.230 subif adminDown 3850:230 VPN230"
Сделать все это можно, и достаточно просто, надо использовать в качестве правила дискаверинга "внешнюю проверку", а не встроенный LLD SNMP.
Уверен каждый сможет это реализовать сам, но все же приведу небольшой пример скрипта для генерации дискаверинга по cisco IP SLA. Загвоздка в том что у ip sla нет ни имени, ни дескрипшена, один только номер и этот номер является индексом. Можно было бы использовать для дискаверинга OID с TargetIPAddress, но он типа OCTET STRING, вообщем это 4 хекс числа, вот облом, можно, конечно, удовлетворится просто номером, но мы все же попробуем собственный дискаверинг и отобразим на графиках {#SNMPVALUE} которое будет содержать читабельный IP адрес тестируемого SLA респондера.
Собственно что бы приспособить скрипт под другие нужны надо лишь вставить свои OID, и их может быть несколько:
Каждый OID сканируется независимо, в результирующих массивах может быть и разныо число элементов. Второй параметр bulkwalk это константа ограничивающая сканирование, защита для дурака, для сканирования индексов интерфейсов на роутере мне, к примеру, прийдется увеличить эту константу до 300+.
Сама логика укладывается в циклы просматривающие массивы и генерящие на выходе массив хешей @json. Последний кусочек скрипта выводящий JSON в stdout универсален, какие хеши дадите то он и выдаст в виде JSON.
Update. Прилепил последнюю версию скрипта для дискаверинга интерфейсов. Пример работы где то на третьей странице треда. Параметры Retry и Timeout при инициализации сессии можно изменить по своему усмотрению. Скрипт работает только по SNMPv2, так как для опроса используется GetBulk() и потому что некоторые железки, в часности cisco, не отдают по SNMPv1 таблицу ifXTable.
До кучи, пример шаблона с данными и графиками и картинга глобальных регулярных выражений, которые в этом шаблоне используются. В шаблоне так же используется макросы:
SNMP_COMMUNITY который вы можете определить глобально, на темплейте или на хостах, ну собственно последний вариант полезнее всего
SNMP_PORT скрипту надо передавать, а использовать порт заданный на интерфейсе в конфигурации хоста я не нашел как, то что заявлено в документации у меня не заработало
SNMP_LLD это строчка, которую будет искать скрипт в дескрипшене (ifAlias) интерфейса и если он ее находит, то в {#TAGS} попадает маркер ",FLAGS,", таким образом вы можем управлять дискаверингом и все подряд интерфейсы не выгребать, использовать это или нет зависит от задачи. Для свичей, например, смысла это особо не имеет, там полезнее сделать регекспы только на признак Physical, т.е. мониторить все физические порты и игнорировать всякие vlanX, а вот для роутеров помечать интерфейсы, которые нужно мониторить, через дискрипшен очень удобно. Я использую {$SNMP_LLD} = "[D]" объявленный глобально.
Update 2. Актуальная версия скрипта, шаблона и regexp в посте 46
Update 3. Решение проблемы валидации JSON в Zabbix 2.2+ тут
Для примера, дискаверинг по интерфейсам дает нам индекс и Descr, а хочется еще
1) тип интерфейса
2) админ статус
3) полный дескрипшен прописанный в конфигурации
4) RD или VRF name, если интерфейс является forwarding
5) и тд и тп
А ведь хочется еще фильтр на это все. Итог: нам нужен JSON в котором кроме всего перечисленного выше еще должен быть {#TAGS} значение которого объединяет важные параметры, по которым мы будем фильтровать, ну например "GigabitEthernet0/2.230 subif adminDown 3850:230 VPN230"
Сделать все это можно, и достаточно просто, надо использовать в качестве правила дискаверинга "внешнюю проверку", а не встроенный LLD SNMP.
Уверен каждый сможет это реализовать сам, но все же приведу небольшой пример скрипта для генерации дискаверинга по cisco IP SLA. Загвоздка в том что у ip sla нет ни имени, ни дескрипшена, один только номер и этот номер является индексом. Можно было бы использовать для дискаверинга OID с TargetIPAddress, но он типа OCTET STRING, вообщем это 4 хекс числа, вот облом, можно, конечно, удовлетворится просто номером, но мы все же попробуем собственный дискаверинг и отобразим на графиках {#SNMPVALUE} которое будет содержать читабельный IP адрес тестируемого SLA респондера.
Code:
#!/usr/bin/perl -w
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});
($targets) = $sess->bulkwalk(0, 100, [['.1.3.6.1.4.1.9.9.42.1.2.2.1.2']]);
die $sess->{ErrorStr} if ($sess->{ErrorNum});
for $i (0..$#$targets) {
if ($$targets[$i]->type eq "OCTETSTR" and length($$targets[$i]->val) == 4) {
push(@json,
{
SNMPINDEX => $$targets[$i]->iid,
SNMPVALUE => join('.', unpack('C*', $$targets[$i]->val))
}
);
}
}
#
# Output in JSON format
#
print "{\n\t\"data\":[";
$first_data = 1;
foreach $data (@json) {
$first_data ? $first_data = 0 : print ",";
print "\n\t\t{";
$first_macro = 1;
while (($macro, $value) = each %$data) {
$first_macro ? $first_macro = 0 : print ",";
print "\n\t\t\t\"{#", $macro, "}\":\"", $value, "\"";
}
print "\n\t\t}";
}
print "\n\t]\n}\n";
Code:
($one,$two,$three) = $sess->bulkwalk(0, 100, [['.1.1.1'],['.2.2.2'],['.3.3.3']]);
Сама логика укладывается в циклы просматривающие массивы и генерящие на выходе массив хешей @json. Последний кусочек скрипта выводящий JSON в stdout универсален, какие хеши дадите то он и выдаст в виде JSON.
Update. Прилепил последнюю версию скрипта для дискаверинга интерфейсов. Пример работы где то на третьей странице треда. Параметры Retry и Timeout при инициализации сессии можно изменить по своему усмотрению. Скрипт работает только по SNMPv2, так как для опроса используется GetBulk() и потому что некоторые железки, в часности cisco, не отдают по SNMPv1 таблицу ifXTable.
До кучи, пример шаблона с данными и графиками и картинга глобальных регулярных выражений, которые в этом шаблоне используются. В шаблоне так же используется макросы:
SNMP_COMMUNITY который вы можете определить глобально, на темплейте или на хостах, ну собственно последний вариант полезнее всего
SNMP_PORT скрипту надо передавать, а использовать порт заданный на интерфейсе в конфигурации хоста я не нашел как, то что заявлено в документации у меня не заработало
SNMP_LLD это строчка, которую будет искать скрипт в дескрипшене (ifAlias) интерфейса и если он ее находит, то в {#TAGS} попадает маркер ",FLAGS,", таким образом вы можем управлять дискаверингом и все подряд интерфейсы не выгребать, использовать это или нет зависит от задачи. Для свичей, например, смысла это особо не имеет, там полезнее сделать регекспы только на признак Physical, т.е. мониторить все физические порты и игнорировать всякие vlanX, а вот для роутеров помечать интерфейсы, которые нужно мониторить, через дискрипшен очень удобно. Я использую {$SNMP_LLD} = "[D]" объявленный глобально.
Update 2. Актуальная версия скрипта, шаблона и regexp в посте 46
Update 3. Решение проблемы валидации JSON в Zabbix 2.2+ тут
Comment