Ad Widget
Collapse
Расширяем snmp lld скриптами
Collapse
X
-
В чём ошибка я кажется нашел, но так как с перлом у меня проблемы решения жду от автора.
json не проходит проверку на валидацию
JSONLint is the free online validator, json formatter, and json beautifier tool for JSON, a lightweight data-interchange format.
Ругается на запятую в конце
Т.е. вывод скрипта такой:Code:},
на 280 строке ругается на запятуюCode:{ "data": [ { "{#IFINDEX}": "48", "{#IFTAGS}": ",FastEthernet0/48,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/48", "{#IFALIAS}": "" }, { "{#IFINDEX}": "22", "{#IFTAGS}": ",FastEthernet0/22,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "#708_Camera", "{#IFDESCR}": "FastEthernet0/22" }, { "{#IFINDEX}": "42", "{#IFTAGS}": ",FastEthernet0/42,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/42" }, { "{#IFINDEX}": "53", "{#IFALIAS}": "Management", "{#IFDESCR}": "Vlan60", "{#IFTAGS}": ",Vlan60,Type:53,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "10", "{#IFALIAS}": "#739_Anna_K.+Irina_P.", "{#IFDESCR}": "FastEthernet0/10", "{#IFTAGS}": ",FastEthernet0/10,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "27", "{#IFDESCR}": "FastEthernet0/27", "{#IFALIAS}": "#775_Eugeniy_O.", "{#IFTAGS}": ",FastEthernet0/27,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "45", "{#IFTAGS}": ",FastEthernet0/45,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/45" }, { "{#IFINDEX}": "12", "{#IFTAGS}": ",FastEthernet0/12,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/12", "{#IFALIAS}": "#771_Andrey_K.+Ivan_S.+Vladislav_D." }, { "{#IFINDEX}": "25", "{#IFDESCR}": "FastEthernet0/25", "{#IFALIAS}": "#751_Mihail_K.+Sergey_K.", "{#IFTAGS}": ",FastEthernet0/25,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "7", "{#IFTAGS}": ",FastEthernet0/7,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "Andenir", "{#IFDESCR}": "FastEthernet0/7" }, { "{#IFINDEX}": "16", "{#IFTAGS}": ",FastEthernet0/16,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/16", "{#IFALIAS}": "#755_Konstantin_V." }, { "{#IFINDEX}": "24", "{#IFDESCR}": "FastEthernet0/24", "{#IFALIAS}": "pbr_mngmnt", "{#IFTAGS}": ",FastEthernet0/24,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "31", "{#IFTAGS}": ",FastEthernet0/31,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "#776_Nikolay_O.+Yuriy_Sh.", "{#IFDESCR}": "FastEthernet0/31" }, { "{#IFINDEX}": "35", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/35", "{#IFTAGS}": ",FastEthernet0/35,Type:6,AdminStatus:down,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "11", "{#IFDESCR}": "FastEthernet0/11", "{#IFALIAS}": "#740_Ul'yana_B.", "{#IFTAGS}": ",FastEthernet0/11,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "47", "{#IFTAGS}": ",FastEthernet0/47,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/47" }, { "{#IFINDEX}": "19", "{#IFDESCR}": "FastEthernet0/19", "{#IFALIAS}": "#750_Anton_Z.+Andrey_Y.", "{#IFTAGS}": ",FastEthernet0/19,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "29", "{#IFTAGS}": ",FastEthernet0/29,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "#745_UniFi", "{#IFDESCR}": "FastEthernet0/29" }, { "{#IFINDEX}": "8", "{#IFDESCR}": "FastEthernet0/8", "{#IFALIAS}": "#756.1_Camera", "{#IFTAGS}": ",FastEthernet0/8,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "14", "{#IFALIAS}": "#766_Vladislav_L.", "{#IFDESCR}": "FastEthernet0/14", "{#IFTAGS}": ",FastEthernet0/14,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "1", "{#IFALIAS}": "vpn_mngmnt", "{#IFDESCR}": "FastEthernet0/1", "{#IFTAGS}": ",FastEthernet0/1,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "13", "{#IFTAGS}": ",FastEthernet0/13,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/13", "{#IFALIAS}": "#767_Alexander_P.+Elena_N." }, { "{#IFINDEX}": "32", "{#IFTAGS}": ",FastEthernet0/32,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "camera703kab", "{#IFDESCR}": "FastEthernet0/32" }, { "{#IFINDEX}": "26", "{#IFTAGS}": ",FastEthernet0/26,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/26", "{#IFALIAS}": "" }, { "{#IFINDEX}": "17", "{#IFTAGS}": ",FastEthernet0/17,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/17", "{#IFALIAS}": "#748_Alexander_G." }, { "{#IFINDEX}": "23", "{#IFALIAS}": "#794_Ol'ga_A.", "{#IFDESCR}": "FastEthernet0/23", "{#IFTAGS}": ",FastEthernet0/23,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "52", "{#IFTAGS}": ",Vlan1,Type:53,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFDESCR}": "Vlan1", "{#IFALIAS}": "" }, { "{#IFINDEX}": "50", "{#IFALIAS}": "", "{#IFDESCR}": "GigabitEthernet0/2", "{#IFTAGS}": ",GigabitEthernet0/2,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "36", "{#IFDESCR}": "FastEthernet0/36", "{#IFALIAS}": "", "{#IFTAGS}": ",FastEthernet0/36,Type:6,AdminStatus:down,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "43", "{#IFTAGS}": ",FastEthernet0/43,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/43" }, { "{#IFINDEX}": "5", "{#IFTAGS}": ",FastEthernet0/5,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "#711_Camera", "{#IFDESCR}": "FastEthernet0/5" }, { "{#IFINDEX}": "38", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/38", "{#IFTAGS}": ",FastEthernet0/38,Type:6,AdminStatus:down,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "21", "{#IFDESCR}": "FastEthernet0/21", "{#IFALIAS}": "ipmi_Nyarlathotep", "{#IFTAGS}": ",FastEthernet0/21,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "41", "{#IFTAGS}": ",FastEthernet0/41,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/41" }, { "{#IFINDEX}": "34", "{#IFDESCR}": "FastEthernet0/34", "{#IFALIAS}": "", "{#IFTAGS}": ",FastEthernet0/34,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "3", "{#IFTAGS}": ",FastEthernet0/3,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/3" }, { "{#IFINDEX}": "28", "{#IFALIAS}": "camera_cars", "{#IFDESCR}": "FastEthernet0/28", "{#IFTAGS}": ",FastEthernet0/28,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "37", "{#IFDESCR}": "FastEthernet0/37", "{#IFALIAS}": "", "{#IFTAGS}": ",FastEthernet0/37,Type:6,AdminStatus:down,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "40", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/40", "{#IFTAGS}": ",FastEthernet0/40,Type:6,AdminStatus:down,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "46", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/46", "{#IFTAGS}": ",FastEthernet0/46,Type:6,AdminStatus:down,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "18", "{#IFTAGS}": ",FastEthernet0/18,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFALIAS}": "#749_Yuriy_H.", "{#IFDESCR}": "FastEthernet0/18" }, { "{#IFINDEX}": "33", "{#IFALIAS}": "Farteks [D]", "{#IFDESCR}": "FastEthernet0/33", "{#IFTAGS}": ",FastEthernet0/33,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "6", "{#IFTAGS}": ",FastEthernet0/6,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/6", "{#IFALIAS}": "Camera '[D]'" }, { "{#IFINDEX}": "4", "{#IFALIAS}": "#711_ERD", "{#IFDESCR}": "FastEthernet0/4", "{#IFTAGS}": ",FastEthernet0/4,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "2", "{#IFALIAS}": "radiusd_mngmnt", "{#IFDESCR}": "FastEthernet0/2", "{#IFTAGS}": ",FastEthernet0/2,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "9", "{#IFALIAS}": "#738_Irina_G.", "{#IFDESCR}": "FastEthernet0/9", "{#IFTAGS}": ",FastEthernet0/9,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "44", "{#IFTAGS}": ",FastEthernet0/44,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/44" }, { "{#IFINDEX}": "49", "{#IFTAGS}": ",GigabitEthernet0/1,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFDESCR}": "GigabitEthernet0/1", "{#IFALIAS}": "Trunk_from_SNR_60.6" }, { "{#IFINDEX}": "15", "{#IFTAGS}": ",FastEthernet0/15,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/15" }, { "{#IFINDEX}": "30", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/30", "{#IFTAGS}": ",FastEthernet0/30,Type:6,AdminStatus:up,Physical,Counter64,FLAG," }, { "{#IFINDEX}": "51", "{#IFDESCR}": "Null0", "{#IFALIAS}": "", "{#IFTAGS}": ",Null0,Type:1,AdminStatus:up,Physical,FLAG," }, { "{#IFINDEX}": "39", "{#IFTAGS}": ",FastEthernet0/39,Type:6,AdminStatus:down,Physical,Counter64,FLAG,", "{#IFALIAS}": "", "{#IFDESCR}": "FastEthernet0/39" }, { "{#IFINDEX}": "20", "{#IFTAGS}": ",FastEthernet0/20,Type:6,AdminStatus:up,Physical,Counter64,FLAG,", "{#IFDESCR}": "FastEthernet0/20", "{#IFALIAS}": "pbr_ipmi" }, ] }Comment
-
Comment
-
Потеребим старушку.
Я тоже накидал своего франкенштейна для SNMP LLD.
Требуется bash v4, snmpwalk, sed. В общем то, что и так уже стоит у нормального человека.
Что умеет: умеет собрать из нескольких subtree JSON.
Например: необходимо получить ifType для отбора ethernet интерфейсов, ifDescr для красивых названий триггеров и графиков и ifSpeed просто так.
Нужно:
1) Положить DiscoverySNMPTrees.sh в ExternalScripts, произвести соответствующую настройку - дать права на выполнение zabbix-ом, задать таймаут.
2) Сделать Discovery rule c ключом:
3) Получить в Zabbix JSON вида:Code:DiscoverySNMPTrees.sh["-c", "{$SNMP_COMMUNITY}", "-s", "{HOST.CONN}", "IFTYPE:.1.3.6.1.2.1.2.2.1.3", "IFDESCR:.1.3.6.1.2.1.2.2.1.2", ".1.3.6.1.2.1.2.2.1.5"]
4) Настроить фильтр: A {#IFTYPE} matches ^6${
"data":[
{ "{#SNMPINDEX}":"1", "{#IFTYPE}":"6", "{#IFDESCR}":"gi0/1", "{#SNMPVALUE2}":"100000000" },
{ "{#SNMPINDEX}":"2", "{#IFTYPE}":"6", "{#IFDESCR}":"gi0/2", "{#SNMPVALUE2}":"0" },
...
{ "{#SNMPINDEX}":"20", "{#IFTYPE}":"135", "{#IFDESCR}":"VLAN_23", "{#SNMPVALUE2}":"0" },
{ "{#SNMPINDEX}":"21", "{#IFTYPE}":"209", "{#IFDESCR}":"br_23", "{#SNMPVALUE2}":"100000000" }
]
}
5) Создавать прототипы с {#IFDESCR}, {#SNMPVALUE2}
Как можно понять из примера, subtree OIDs для выборок задаются после всех именованных параметров и допускают наличие префикса, который становится именем макроса в JSON. Если префикс не задан, то его имя будет сгенерированно в виде SNMPVALUEN, где N - порядковый номер аргумента, не принадлежащего какому-либо ключу, в командной строке. Первый OID - SNMPVALUE0, второй - SNMPVALUE1 и т.д.
{#SNMPINDEX} берется из первого в списке аргументов дерева. Если в нем отсутствуют какие-либо индексы, то элементы с эквивалентными индексами из других деревьев в JSON не попадут.
На устойчивость обработки деревьев с over 9000 элементов скрипт не претендует. На количество OID-ов ограничений не установлено, но их избыточное количество наврядли будет полезно для работы. Как, впрочем, и излишнее увлечение ExternalScript-ами.Attached FilesLast edited by sadman; 07-04-2015, 11:48.Comment
-
Подправил логическую ошибку в скрипте и добавил два параметра: -r regexp и -k anystring
-r применяется для фильтра на стороне скрипта, regexp, в целом, такой же, какой применяется для фильтра в zabbix. Например ^71$
-k необходим, если скрипт используют несколько discovery rules и исследуют одинаковые subtree. В этом случае ключ правила (равный набору параметров скрипта) выходит одним и тем же и, как следствие, нет возможности создать более одного такого правила. В этом случае остается менять параметры местами или написать в -k любую уникальную чушь.
Актуализированный скрипт в предыдущем посте.Comment
-
Так-то да, но запуск перла с подсасыванием репозитория может оказаться ненамного дешевле.
Для меня перловка проигрывает по переносимости - пока все эти либы со спана вспомнишь, накатишь, поймешь почему не работают - уже и вечер наступит. С шеллом же просто все - скрипт положил, темплейт импортировал и готово дело. Впрочем, дело вкуса и упорства - можно для развертывания написать скрипт, который развертывать ещё одним скриптом ))
И я думаю, что запуск шелла раз в час или даже раз в три часа для дискаверинга наврядли сильно придушит систему в небольших офисных инсталляциях, в которых админ одной ногой патч-корд обжимает, а второй - бежит к директору домой скайп настраивать. Там больше двух десятков свичей все равно не бывает - самое то для шелл-скрипта.
На крупных же системах сидят специальнооплачиваемые люди и пишут высокопроизводительные модули, наверное. И у них уже все есть.Comment
-
Это что такое?
На счет модулей, NetSNMP это кусок netsnmp проекта, в нормальных юниксах оно C библиотека, perl и phyton модули ставятся вместе. Это только в линуксах во всех дистрибутивах она подроблена на несколько пакетов. А JSON я изначально не хотел использовать как раз по причине чтобы не нужно было лишние библиотеки ставить, хотя мне как раз проще JSON доставить чем рисовать на 10 строк генерацию валидного json.
В треде так же можно найти ссылку на python версию дискаверинга интерфейсов. В любом случае нормальный скриптовый язык на порядки быстрее шеловского скрипта и при этом в дистрибутиве в любом случае стоит либо perl либо phyton.Comment
-
Может выразился ненаучно, конечно. Перл же складывает свои .pm-ки куда-то, как я понимаю. Потом нужные подгружает. Вроде как-то так же он действует?
Пусть будет и на баше - жалко что ли? ))
Боюсь, что ответ на вопрос о выгоде тут неочевиден.
Помнится мне, что под спектрумы на ассемблере писали и под 64к оптимизировали, а сейчас уже кому это надо? Хаускипер систему задушит сильнее сорока экземпляров одновременно выполняемых скриптов - к чему тут выгадывание 0.5сек?
В конце концов точку может поставить только исследование - 500 тыщ запусков, усредненное затрачиваемое на выполнение время... 500 тыщ человеков-инсталляторов того, другого и третьего варианта, усредненное затрачиваемое на настройку время.Last edited by sadman; 07-04-2015, 17:20.Comment
-
У меня только v2 к вашему сожалению. В принципе - добавить несколько параметров для работы с v3 недолго, но проверить корректность выполнения скрипта я не смогу. Шаблон для примера прикладываю.Attached FilesComment
-
Что-то скрипт не очень работает со многими Alias.
Допустим есть интерфейс
interface GigabitEthernet0/18
description --- Blabla ---
После использования скрипта из консоли: ./DiscoverySNMPTrees.sh -c public -s 1.1.1.1 IFDESCR:.1.3.6.1.2.1.31.1.1.1.18
Пишет: ./DiscoverySNMPTrees.sh: line 133: arrIndexes: bad array subscript, но отображение идет:
{ "{#SNMPINDEX}":"10119", "{#IFDESCR}":"---""{#Blabla}":"---" },
В самом zabbix пишет следующие "Value should be a JSON object".Comment
-
Спасибо за тестирование.
Попался в стандартную ловушку с кавычками и пробелами, на этот раз в printf:
Code:#!/bin/bash str="--- vlan ---" echo "[1]" $str printf "[2] %s\n" "$str" printf "[3] %s\n" $str
Ну ничего, заодно отловил ещё пару моментов, связанных с пустыми значениями SNMP OID-ов.Code:[1] --- vlan --- [2] --- vlan --- [3] --- [3] vlan [3] ---
Подправленный скрипт в аттаче.Attached FilesComment
-
Доброго времени суток. К сожалению очень плохо знаю perl, может найдется кто-то, кто сможет подправить скрипт? Суть вот в чём, - нужно выводить ip адрес интерфейса.
Индекс интерфейса мы знаем. В cisco есть oid .1.3.6.1.2.1.4.20.1.2, который выдает, что-то вроде .1.3.6.1.2.1.4.20.1.2.192.168.0.1= INTEGER: 5, где INTEGER :5 - совпадает с индексом интерфейса, нужно отрезать от OID четыре последних октета, которые и будут ip адресом и передать в вывод JSON.
Возможно, есть способ и проще?.. Если кто-то сможет подправить скрипт, буду очень благодарен.Comment
Comment