Сегодня я хочу показать и заодно задокумментировать себе каким образом снимаю информацию по состоянию SFP(SFP+) модулей в Mikrotik(ах) которые объединяют офисные здания в единую информационную систему. Просто я стараюсь все и вся чтобы я знал, что и где происходит и, как и что меняется со временем, вот для этого у меня Zabbix и развернут, плюс — это интересно, а время у меня есть все разбирать так как вся инфраструктура задокумментирована. И опираясь на это мне проще работать.

В заметке используется следующее:

srv-zabbix.polygon.local

OS: Ubuntu 18.04 Server

sw_2-3-1.polygon.local

Mikrotik CRS328-24P-4S+ (v6.45.6)

sw_1-2-1.polygon.local

Mikrotik CRS326-24G-2S+ (v6.46.1)

Шаг №1: Мой рабочий сервис в лице Zabbix развернут на Ubuntu 18.04 Server + Zabbix 5.0.9 опираясь на заметку: "Устанавливаем Zabbix 5 + Nginx on Ubuntu 18.04 Server"

Настройки для Zabbix Server на самом сервере:

ekzorchik@srv-zabbix:~$ cat /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=localhost
DBName=db_zabbix
DBUser=us_zabbix
DBPassword=612mbddr@
DBPort=3306
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=30
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
CacheSize=64M
HousekeepingFrequency=24
MaxHousekeeperDelete=10500
ekzorchik@srv-zabbix:~$

Настройки для Zabbix Agent на самом сервере:

ekzorchik@srv-zabbix:~$ cat /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
#EnableRemoteCommands=1
AllowKey=system.run[*]
LogRemoteCommands=1
Timeout=30
Server=127.0.0.1, srv-zabbix.polygon.local
ServerActive=127.0.0.1,srv-zabbix.polygon.local
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf
UnsafeUserParameters=1
ekzorchik@srv-zabbix:~$

Шаг №2: Т.к. Zabbix развернут в корпоративной среде, то для оперативного получения информации о происшествиях и просто о моментах что в подконтрольной среде происходит настроена связка Zabbix 5.0.9 + Exchange 2010 (Version: 14.03.0509.000) опираясь на заметку: "Настройка Zabbix 5.0.41 на уведомление через почту Exchange 2010"

Шаг №3: У меня получение информации с Mikrotik(а) по части SFP(SFP+) модулей будет строится на базе подключения к Mikrotik(у) по SSH и извлечению информации из вывода.

Шаг №4: Подключаюсь через Winbox к Mikrotik(ам) и создаю на них учетную запись с правами Read, если Zabbix Server владеете только вы, то можно и под текущей Вашей административной информацией подключаться.

Шаг №5: Устанавливаю в систему утилиту sshpass:

ekzorchik@srv-zabbix:~$ sudo apt-get install sshpass

Шаг №6: Даю права учетной записи ekzorchik взаимодействовать c командами системы без запроса авторизации:

ekzorchik@srv-zabbix:~$ sudo visudo
ekzorchik   ALL=(ALL) NOPASSWD:ALL

Шаг №7: Подключение к Mikrotik осуществляется следующим образом:

ekzorchik@srv-zabbix:~$ sshpass -p Aa1234567aA ssh -o "StrictHostKeyChecking no" zabbixviewer@sw_2-3-1.polygon.local -p 22 "interface ethernet monitor sfp-sfpplus2 duration=1" | grep rate
rate: 1Gbps
ekzorchik@srv-zabbix:~$

Шаг №8: Подключаюсь по SSH к Zabbix серверу и создаю скрипт который будет извлекать необходимые параметры значений интерфейса с Mikrotik'а:

ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/externalscripts/sfpcheck.sh
#!/bin/bash
SERVER=$1
SSHPORT=22
TIMEOUT=25
SSHPASS=Aa1234567aA
SSHUSER=zabbixviewer
SFPINTERFACE=$2
#rate
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep rate
#status
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep status
#sfp-connector-type
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-connector-type
#sfp-type
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-type
#sfp-vendor-part-number
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-vendor-part-number
#sfp-temperature
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-temperature
#sfp-supply-voltage
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-supply-voltage
#sfp-tx-bias-current
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-tx-bias-current
#sfp-tx-power
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-tx-power
#sfp-rx-power
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-rx-power
#eeprom-checksum
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep eeprom-checksum
ekzorchik@srv-zabbix:~$ sudo chmod +x /usr/lib/zabbix/externalscripts/sfpcheck.sh

Шаг №9: Проверяю выполнение скрипта нацелив его на определенный интерфейс Mikrotik CRS328-24P-4S+

ekzorchik@srv-zabbix:~$ sudo /usr/lib/zabbix/externalscripts/sfpcheck.sh sw_2-3-1 sfp-sfpplus2
rate: 1Gbps
status: link-ok
sfp-connector-type: LC
sfp-type: SFP-or-SFP+
sfp-vendor-part-number: SFP-BX-D
sfp-temperature: 56C
sfp-supply-voltage: 3.29V
sfp-tx-bias-current: 23mA
sfp-tx-power: -6.081dBm
sfp-rx-power: -10.339dBm
eeprom-checksum: good
ekzorchik@srv-zabbix:~$

а вот если указать другой интерфейс, то в нем уже не такие данные извлекаются:

ekzorchik@srv-zabbix:~$ sudo /usr/lib/zabbix/externalscript/sfpcheck.sh sw_2-3-1 sfp-sfpplus4
rate: 1Gbps
status: link-ok
sfp-connector-type: LC
sfp-type: SFP-or-SFP+
sfp-vendor-part-number: SFP-BX-D55
eeprom-checksum: good
ekzorchik@srv-zabbix:~$

т.е. мне придется вручную составлять скрипты под каждое значение, ну пока по крайней мере так, надо же с чего-то начать.

Шаг №10: Создаю на Zabbix сервере конфигурационный файл, который будет извлекать из скрипта значение параметра sfp-temperature:

ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/externalscripts/sfptemp.sh
#!/bin/bash
SERVER=$1
SSHPORT=22
TIMEOUT=25
SSHPASS=Aa1234567aA
SSHUSER=zabbixviewer
SFPINTERFACE=$2
#sfp-temperature
sshpass -p $SSHPASS ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "LogLevel ERROR" $SSHUSER@$SERVER -p $SSHPORT "interface ethernet monitor $2 duration=1" | grep sfp-temperature | cut -d ':' -f2 | tr -d ' '

Шаг №11: Создаю на Zabbix сервере настройки для Zabbix агента через который будет совершаться взаимодействие с узлом Mikrotik(а) формировав ключ который обращается к скрипту получения параметра:

ekzorchik@srv-zabbix:~$ sudo nano /etc/zabbix/zabbix_agentd.d/sfptemp.conf
UserParameter=sfp-temperature[*],/usr/lib/zabbix/externalscripts/sfptemp.sh "$1" "$2"

$1 - это мне нужно передать IP&DNS Mikrotik куда я подключаюсь скриптом с паролем на подключение в скрипте

$2 - указываю наименование SFP интерфейса.

Итого:

ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t sfp-temperature[sw_2-3-1.polygon.local,sfp-sfpplus2]
sfp-temperature[sw_2-3-1.polygon.local,sfp-sfpplus2] [t|56C]
ekzorchik@srv-zabbix:~$

вот теперь это я уже могу завести в Web Zabbix

Шаг №12: Создаю шаблон в Web интерфейсе Zabbix:

http://srv-zabbix/zabbix - user&pass - Настройка - Шаблоны - Создать шаблон

  • Имя шаблона: Template_Mikrotik_SFP
  • Группы: GROUP_MIKROTIK

и здесь же перехожу на вкладку "Макросы" и создаю с каждой новой строки колонки "Макрос": {$SFP1},{$SFP2},{$SFP3},{$SFP4},{$SW121},{$SW231}

Напротив каждого значения в колонке "Значение": sfp-sfpplus1,sfp-sfpplus2,sfp-sfpplus3,sfp-sfpplus4,sw_1-2-1.polygon.local,sw_2-3-1.polygon.local

см скриншот для наглядного понимания, как это выглядит:

Предопределяю макросы в шаблоне Template_Mikrotik_SFP

после нажимаем "Обновить", опять переходим в созданный шаблон и в "Элементе данных" создаем "Создать элемент данных"

  • Имя: SW231 SFP2 Temp
  • Тип: Zabbix агент
  • Ключ: sfp-temperature[{$SW231},{$SFP2}]
  • Тип информации: Символ
  • Интервал обновления: 30m
  • Пользовательские интервалы: Переменный
  • Период хранения истории: Период хранения 60d
  • Отображать значения: Как есть
  • Новая группа элементов данных: SFP
  • Заполнение поля инвентаря узла сети: Нет
  • Описание: sfp to sw_1-2-1
  • Активировано: отмечаю галочкой

и нажимаю "Добавить"

Шаг №13: Создаю триггер на элемент данных Имя: SW231 SFP2 Temp

в шаблоне "Template_Mikrotik_SFP" перехожу на вкладку "Триггеры" и нажимаю "Создать триггер"

  • Имя: SW231 SFP2 Temp High
  • Важность: Высокая
  • Выражение: {Template_Mikrotik_SFP:sfp-temperature[{$SW231},{$SFP2}].last(#3,5)}>=70
  • Генерация ОК события: Выражение
  • Режим генерации событий ПРОБЛЕМА: Множественный
  • ОК событие закрывает: Все проблемы
  • Разрешить закрывать вручную: Отмечаю галочкой
  • Активировано: Отмечаю галочкой

и нажимаю "Добавить"

Шаг №14: Связываю созданный шаблон "Template_Mikrotik_SFP" с узлом "Zabbix server"

http://srv-zabbix/zabbix - user&pass - Настройка - Узлы сети — отсортировываю по имения (Имя: zabbix) и нажимаю Применить, перехожу в "Zabbix server", затем на вкладку "Шаблоны" и через "Присоединение новый шаблонов" нажимаю "Выбрать" присоединяю шаблон "Template_Mikrotik_SFP". В итоге вот текущий список шаблонов у узла "Zabbix server":

Присоединяю шаблон Template_Mikrotik_SFP к узлу Zabbix server

и нажимаю "Обновить"

Шаг №15: Проверяю, как визуализируются получаемые данные Zabbix сервером с Mikrotik(а): sw_2-3-1.polygon.local, к примеру можно принудительно запустить применение шаблона:

http://srv-zabbix/zabbix - user&pass - Настройка - Узлы сети

  • Узлы сети: Zabbix server
  • Имя: SW

и нажимаю "Применить", после нажимаю в "Группы элементов данных" на SFP, получает вот так:

выделяю имя "Template_Mikrotik_SFP: SW231 SFP2 Temp" и нажимаю "Выполнить сейчас"

Принудительно выполняю элементы данных из шаблона на узле Zabbix server.

затем переключаюсь на просмотр последних данных:

http://srv-zabbix/zabbix - user&pass - Мониторинг - Последние данные

  • Узлы сети: Zabbix server
  • Имя: sfp

и нажимаю "Применить"

перехожу в "История" элемента "SW231 SFP2 Temp" и вижу

Получаемая информация по температуре с модуля SFP на Mikrotik и отображаемая в Zabbix.

По итогу получаю колонку с извлекаемыми данными, жалко, что они в текстовом виде и я не могу строить график изменения температуры с учетом времени, ну ничего, пока я данную задачу вижу так, может со временем я найду более расширенный способ.

Вот по такому же принципу и по всем остальным полям проделываю:

  • Скрипт извлечения нужно значения
  • UserParameters получения через скрипт
  • Заведение в шаблон нового элемента данных
  • Создание если нужно триггера.

Ну как бы собственно и все, значение температуры с SFP модулей которые его отдают, отображая в свойствах интерфейса на Mikrotik я получил и передаю в Zabbix 5.0.9

На этом пока я завершу свою заметку, мне она помогает, надеюсь и для Вас станет отправной точкой в Ваших задумках, с уважением автор блога Олло Александр aka ekzorchik.