Jump to content
iT4iT.CLUB

Search the Community

Showing results for tags 'zabbix'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Operating systems
    • UNIX
    • Mac OS
    • Windows
  • Monitoring System
    • Zabbix
  • Network hardware
    • Cisco Systems
    • MikroTik
    • Ubiquiti Networks
  • Microcontrollers
    • Arduino

Blogs

There are no results to display.

There are no results to display.

Categories

  • Zabbix
    • Templates
  • Arduino
    • Espressif Systems
    • Libraries
  • UNIX

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 14 results

  1. Всем привет. Начнем как всегда с предыстории! Цель, сбор данных с различных устройств на очень большой территории промышленного предприятия. Естественно финансирование просто огромное, хватит на большую пачку семечек и пачку индийского чая, возможно даже сдача останется, но не факт. А Вы как думали? В сказку попали? В связи с этим устройства самодельные, на базе популярных микроконтроллеров фирмы ATmel с прикрученным Ethernet. И естественно самый простой способ обмена не критической информацией - MQTT протокол. Т.к. предприятие не малое, цеха большие, то IT оборудование раскидано на агрегатах и для защиты от воздействия внешней среды, оно находится в гермозонах. Температура внутри поддерживается кондиционерами, но они, как и все в этом мире, стремятся раствориться в небытии, и с легкостью потянут за собой все оборудование, что трудится в гермозонах на благо предприятия. И так. Для начала Вам понадобится свой брокер c MQTT клиентом. Хотя у Вас он скорее всего уже есть. Его роль может выполнять как сам zabbix сервер, так и отдельная машина. В последнем случае дополнительно потребуется установка zabbix агента. Все инструкции и дистрибутивы имеются на официальном сайте mosquitto.org Я использую в качестве операционной системы Linux Ubuntu и для меня все очень просто. sudo apt-get install mosquitto mosquitto-clients Настройка брокера - это отдельная тема и затрагивать её здесь не будем. Вносим дополнения в конец файла конфигурации zabbix агента на сервере nano /etc/zabbix/zabbix_agentd.conf Добавляем пользовательский параметр MQTT UserParameter=mqtt[*],/usr/bin/mosquitto_sub -h 127.0.0.1 -t $1 -C 1 -N 2>/dev/null Сброс ошибок в /dev/null необходим из-за возможности их появления в случае запуска клиента от пользователя, у которого нет собственного домашнего каталога. В противном случае можно получить в довесок к выводу сопроводительное письмо со следующим текстом. Переходим в панель управления Zabbix. Теперь нам доступна возможность создавать элементы данных содержащих ключи следующего вида. mqtt[адресс необходимого топика] mqtt[/room213/door1/lock/status] mqtt[/garage/smoke/level] mqtt[/room/sensors/temperature1] Каждый ключ соответствует адресу топика с которого нужно взять ту или иную информацию. И сама структура топика просто идеальна для иерархии оборудования или ветвления расположений объектов. Но Вы и так это видите. Создаем узел сети с ip адресом Zabbix сервера или просто 127.0.0.1, тип проверки "Zabbix агент". Указываем интересующий нас топик и слушаем. ВАЖНО: Клиенты рассылающие сообщения должны использовать параметр "-r, --retain" для сохранения сообщения у брокера. Без этого параметра Zabbix не сможет получить данные т.к не поддерживает постоянную связь с брокером, а лишь забирает последние данные по установленному интервалу времени. Команда для отправки тестовой строки "message" в топик "test/string" /usr/bin/mosquitto_pub -h 127.0.0.1 -r -t test/string -m "message" Для начала мне потребовалось снимать показания температуры внутри и снаружи гермозон. Это экстренная необходимость т.к в случае ч.п, в зимнее время, температуры внутри может превышать 30 градусов Цельсия, а в летнее температура пола рядом со зданием в котором находится гермозона может превышать 70-80 градусов Цельсия, а про температуру оборудования я вообще молчу. И да, мы не конфеты делаем, к сожалению... Для меня удобнее создать шаблон, который будет добавлен к серверу с MQTT брокером. Это дает гибкость в случае замены самого брокера или миграции сервера на другую платформу. Интересующий нас ключ отмечен на рисунке, все остальное на Ваше усмотрение. Все данные показанные ниже идут с тестового стенда, установленного за пределами экстремальных зон! Так выглядят первые элементы данных. Это показания с двух датчиков температуры и данные с внутреннего таймера микроконтроллера. Последние показания нужны для отслеживания зависания устройства. такое и мало вероятно. Но оно и имеет сторожевой таймер, лишняя перестраховка в промышленных масштабах не помешает. Текущие показания. Ну и естественно график, куда без него. Прост и так скудный) Можно организовать скрипт, поддерживающий несколько входных параметров, но это уже вопрос желания и необходимости.
  2. Version 1.0.0

    153 downloads

    Модуль предназначен для системы мониторинга Zabbix. Работает в качестве отдельного демона и осуществляет транзит сообщений от брокера до хостов в системе мониторинга. Подробное описание модуля можно посмотреть в следующей теме.
  3. Тема является своего рода заметкой по мониторингу источников бесперебойного питания фирмы ippon. Заметкой именно потому, что шаблон был написан уже давно, а статья так и не появилась на свет и как обычно бывает, все постепенно начинает забываться, а наработанная информация растворяться в бытие. Дабы не потерять последние крошки выкидываем оставшиеся наработки. Постепенно тема будет переписана и дополнена. Самым удобным способом мониторинга является, уже знакомый нам по теме с ИБП APC, протокол SNMP. Для подключения устройства в локальную сеть необходимо дополнить его сетевым адаптером UPS Ippon Smart Winner 1500/2000/3000. Сама карточка поддерживает следующие протоколы: HTTP HTTPS IPv4 IPv6 NTP SMTP SNMP v1 SNMP v2c SNMP v3 SSH V1 SSH V2 SSL TCP/IP Telnet На диске, идущем в комплекте, имеется весь необходимый софт и документация. Также, если немного покопаться, можно найти MIB файл со всеми поддерживаемыми OID. На всякий случай мы прикрепим к посту MIB файл на базе которого был создан текущий шаблон. Перед тем как перейти к шаблону хочу отметить, что он содержит макрос {$SNMP_COMMUNITY} значение которого необходимо изменить на используемое вами Community. Шаблон позволяет производить мониторинг следующих параметров: The measured output real complex power in VA Величина отрицательного напряжения аккумуляторной батареи Величина положительного напряжения аккумуляторной батареи Версия прошивки Network Management Card Версия прошивки микропроцессора Время оставшееся до истощения заряда батареи Время прошедшее с момента перехода на работу от батареи Входная мощность Входное напряжение Входной ток Выходная мощность Выходная нагрузка ИБП в процентах от номинальной мощности Выходное напряжение Выходное напряжение Выходной ток Код неисправности ИБП из таблицы Q6 Код предупреждения ИБП из таблицы Q6 Максимальная разрешенная выходная нагрузка Максимальная разрешенная рабочая температура Модель ИБП Название производителя Описание напитанной нагрузки (устанавливается администратором) Описание устройства (устанавливается администратором) Серийный номер Статус батареи Текущее состояние ИБП Температура батареи Температура внутри ИБП Уровень заряда батареи Частота тока на входе Частота тока на выходе Данных параметров должно быть достаточно для создание базовых проверок и триггеров. Мы добавили несколько для основных тревог. И пару базовых графиков. Данный шаблон вполне подойдет для создания на его основе Ваших решений. Мы будем рады увидеть Ваши наработки или помочь Вам в реализации, каких либо идей по мониторингу этих источников бесперебойного питания. EPPC.MIB.zip templates_ups_ippon.xml.zip
  4. Описанный ниже велосипед является продолжением одной из моих статей на другом, интересном мне, ресурсе. Продолжение и все последующие обновления будут происходить только на it4it.club Для начала, хочу процитировать самого себя и тем самым дать пояснения: почему, зачем и для кого это нужно. Данная тема получила большую популярность у коллег и не раз выручила Вашего покорного слугу, не дав разгореться стулу на котором он сидит. Но имеющегося функционала стало не хватать, требовалось не только слышать и иногда видеть, а еще получать удаленный доступ к оборудованию и лицезреть всю картину в целом. Задача поставлена, идем исполнять, но с начало забегу немного вперед и продемонстрирую текущий функционал. Общее окно программы переработано и теперь отображает список всех групп из Zabbix с их хостами. Список активных триггеров переехал в нижнюю часть окна и отображает дополнительную информацию об узлах с которыми не все гладко. Сам список можно увеличивать, если все совсем плохо, или уменьшать если выражение "Хьюстон у нас проблемы" Вы слышите только в фильмах. Также появились цветные маркеры важности триггера. По двойному клику по активному триггеру мы перемещаемся в соответствующую группу где находится проблемный узел. Не забыли и про то, ради чего вся начальная песня и писалась - трей с всплывающими оповещениями и звуковым сигналом. Основное окно сворачивается именно туда, чтобы не залеживаться на панели где ценится каждый свободный пиксель. Хосты в группах стали кликабельны, правда пока только ПКМ, и имеют всплывающее меню позволяющее выполнять банальные действия: Подключение к узлу: Telnet SSH RDP VNC Проверка соединения: Ping Traceroute Естественно его можно расширить, добавив всяких вкусностей по мере возрастания аппетита IT отдела. Программа по прежнему имеет серверную и клиентскую часть, что позволило организовать кэширование запросов и осуществлять оповещения в момент определения проблемы сервером, а не по таймеру обновления, как это организовано в dashboard zabbix. Раньше узнали о проблеме, раньше приступили к устранению. Естественно и устаревшие триггеры убираются также оперативно. Также это позволило избавить программу от информации о доступе к серверу, что мне кажется не приемлемым для оповещалки. Чем меньше дырок, тем крепче сон. Приступим к реализации. Ну и естественно, Ваш покорный слуга еще не научился писать на C++ ничего более сложного чем "Hello World", поэтому клиент и сервер будет написан на PHP. За исключением того момента, что клиентская часть (при помощи магии Гарри Поттера) станет бинарным файлом. Бог с ним, серверная часть не доступна обывателю, а это самое важное!!! Для начала, нужно придумать безопасный и понятный алгоритм не нагружающий сервер т.к клиентов может быть 100и или 1000и, всякое бывает. Все не безопасные команды обязаны выполняться на сервере без участия клиента. Дальнейшая работа клиента: обработка данных, выполнение действий с триггерами и т.п должно выполняться только у клиента, не затрагивая сервер. При обращении клиента к серверу по http происходит проверка его ip на наличие в списках разрешенных. В противном случае показываем фигу. Проверяем, наличие актуального кеша, и отдаём его. Если кеша нет, генерируем новый. Если запрос прилетел от zabbix: принудительно считаем кеш устаревшим, генерируем новый и после этого рассылаем всем клиентам оповещения по UDP протоколу. Это позволит свести расход ресурсов базы данных к нулю т.к все клиенты ринутся забирать новые данные, а все уже в кеше. Супер, все дешево и сердито. Серверная часть представляет из себя файл index.php где-то на Вашем web сервере. Актуально для Zabbix 2.4 (скорее всего будет актуальна и для последующих версий, будем проверять по мере возрастания аппетита). Для дополнительной безопасности рекомендую создать отдельную учетную запись в базе данных с правами только на чтение и только к базе zabbix. Это актуально в наши дни. Переходи в zabbix Первым делом переходим в Настройка -> Действия -> Источники события: Триггеры и создать новое действие. Назовем случайным образом, например Report problems to ZabbixTrigger. В условиях выставляем Значение триггера = ПРОБЛЕМА Значение триггера = OK Это все необходимо, чтобы проблемы в GUI появлялись и исчезали точно именно тогда, когда это происходит в Zabbix (не путать с dashboard). Вкладка "Операции" должна выглядеть следующим образом. Естественно что путь до php скрипта должен быть вашим. Вуаля! Если Вы все сделали правильно (без кардинальных изменений), то я рад приветствовать нового ездока моего велосипеда. Поедем тандемом! Сам клиент прикреплен в конце поста. Для тех, кто читает титры в кинотеатре При запуске будет создан файл config.ini в корне программы. При необходимости, измените его настройки, благо их не много. [server] url="http://zabbix/zabbix-gui" update="60" [client] showalarm="20" Параметр url отвечает за http путь до скрипта на сервере, update за интервал (в секундах) обновления данных с сервера, а showalarm вроде как должен влиять на время отображения всплывающей подсказки в трее. Теперь немного структуры. В каталоге sounds находится звук оповещения о новом триггере, формат ogg Каталог icons содержит маркеры триггеров. trigger00 - для нормального состояния, а все последующие соответствуют начальным настройкам zabbix во вкладке Администрирование -> Общие раздел Важность триггеров. Можете изменить на свои цвета, программа все подхватит при перезагрузки. Ну и на закуску каталог ext, это как говорится для меломанов, содержит фри программы для обработки внешних действий клиента. Вы можете заменить их на свои при условии, что стандартные имена параметров запуска и их последовательность совпадают. PS: На этом все, спасибо тем кого это заинтересовало. Предлагайте свои идеи или способы доработки велосипеда. А если найдется программист на C++ так милости просим. В любом случае, функционал будет в дальнейшем расширяться. zabbixTrigger.zip
  5. Version 1.0.0

    67 downloads

    Шаблон и список преобразований значений для мониторинга маршрутизаторов и свичей фирмы Cisco (должен подходить для оборудования Allied Telesis). Подробное описание можно посмотреть в следующей теме.
  6. Version 1.0.0

    38 downloads

    Шаблон и список преобразований значений для мониторинга источников бесперебойного питания фирмы APC. Подробное описание можно посмотреть в следующей теме.
  7. Привет друзья. В данной теме пойдет речь о конфигурации микроконтроллера через UART (Universal Asynchronous Receiver-Transmitter) интерфейс. А рассмотрим мы это на примере MQTT логгера. В данном случае, это будет логгер температуры. Мне это устройство потребовалось на работе, даже не мне, а моим коллегам, и оно действительно работает и приносит огромную пользу т.к контроль температуры производится совместно с отличной, на мой взгляд, системой мониторинга Zabbix с оперативными оповещениями, построением графиков, блэк-джеком и... Подробнее о дружбе Arduino и Zabbix можно почитать тут Но как всегда, есть нюансы. А заключаются они в том, что в будущем, обслуживать армию мелких контроллеров придется людям, которые заняты своими задачами и им попросту некогда изучать Arduino, не говоря уже о серьезных альтернативах, разбираться в том, как прописать нужные значения переменных в программу и загрузить её в микроконтроллер. Все настройки необходимо производить быстро, с явным указанием изменяемого параметра и его значения. Ровно также, как это делается с любым промышленным оборудованием. И тут на помощь приходит UART Микросхема UART to USB имеется в большинстве плат семейства Arduino, а там, где её нет, обычно выведены соответствующие "пины". И все это очень облегчает жизнь т.к позволяет общаться с контроллером, просто подключив его к компьютеру напрямую или через переходник, благо их везде навалом, да и стоят они как пачка семечек. Остается только запустить любой терминал, который умеет доставлять в конец строки символ "перевод строки", что известен в народе как "\n", а в ASCII таблице имеет номер 0A. Кстати, в Serial мониторе Arduino IDE выставить символ конца строки можно так Ну а дальше только, что и остается, как общаться с устройством на той стороне. И тут мы переходим к основному алгоритму программы. Но перед этим хочу отметить, и это ВАЖНО, что за любое упрощение жизни, всякие красивости и прочее, приходиться платить, и цена довольно высока! В данном случае, это ОЗУ микроконтроллера. Поэтому не раскатываем губы, а если очень хочется, то берем следующий по характеристикам микроконтроллер. А начинать мы будем с ATmega328P, что известен в народе как Arduino UNO, Arduino Nano, IBoard v1.1 и т.д по списку. Заканчивать Вы можете чем угодно, хоть ATmega2560, ESP8266 или ESP32. В противном случае, производим оптимизацию кода, отказываемся от громоздких библиотек, или вообще, от Arduino IDE. Что мы хотим получить Вся конфигурация микроконтроллера должна храниться в энергонезависимой памяти (ПЗУ) известной нам как EEPROMM. Если в ПЗУ конфигурация отсутствует, необходимо иметь резервный план. И им станет сброс конфигурации на настройки по умолчанию. Это поведение знакомо всем, особенно по домашним дешевым маршрутизаторам, а значит, интуитивно понятно. Выводить справку при начале общения пользователя и устройства, на мой взгляд, как манеры высшего общества. Контроллер должен представляться и сообщать всю необходимую информацию о себе и о том, как с ним вести диалог. Все команды должны быть просты и иметь не двусмысленное значение. И конечно, мы должны иметь возможность просмотра текущего состояния датчиков или процессов, которыми занимается устройство в свободное от общения с нами время. Как сохранять конфигурацию в EEPROM Пожалуй, стоит начать с того, как сохранить конфигурацию микроконтроллера в энергонезависимую память. Для этих целей, в стандартный набор инструментов Arduino IDE входит библиотека для работы с EEPROM. #include <EEPROM.h> На данный момент нас интересуют две функции, это чтение и запись EEPROM.get(address, variable); EEPROM.put(address, variable); Обе принимают два параметра: Адрес, начиная с которого будет произведено чтение или запись данных в память Переменная чье содержимое надо сохранить или в которую нужно из памяти прочитать Особенность работы этих функция заключается в том, что в зависимости от типа переданной им переменной во втором параметре, будет произведено чтение или запись ровно того количества данных которое соответствует размеру типа этой самой переменной. На простом языке это означает, что если переменная variable будет иметь типа byte, то и работать мы будем с объемом памяти в 1 байт. И тоже самое произойдет с абсолютно любым типом данных пока мы не упремся в размеры самого EEPROM или ОЗУ микроконтролера. Из этого всего следует, что мы можем создать свой собственный тип данных, разместить в нем необходимую нам информацию и всего лишь двумя функциями помещать его в память и извлекать обратно. И в этом нам поможет пользовательский составной тип - структура (struct). Данный тип позволяет объединить в себе различные типы данных, упорядочить их и присвоить им понятные имена. Это общий пример для большего понимания, как объединить несколько типов данных в одной структуре, получить к ним доступ, записать и прочитать их из EEPROM. Наша структура будет немного сложнее, но суть остается той же самой. // Дополнительная структура описывающая IPv4 адреса struct addres { byte a; byte b; byte c; byte d; }; // Структура объекта конфига для хранения в EEPROM struct configObj { addres ip; addres subnet; addres gateway; addres dns; byte mac[6]; byte hex; char server[40]; char topic[40]; } config; Данная структура хранит сетевые настройки для работы с Ethernet модулем (w5100 и выше) Arduino, базовые настройки для связи с MQTT брокером. Сразу при описании структуры мы объявили новую переменную с именем config с типом нашей структуры. ВАЖНО: кроме наших данных в структуре имеется дополнительная переменная с именем hex. Её задача, это контроль наличия наших данных в EEPROM. Она всегда должна содержать одно и тоже значение. Представьте ситуацию, что вы взяли контроллер в EEPROM которого находится какая-либо информация (может там чисто, но мы этого не знаем наверняка) и мы прочитаем данные и поместим их в нашу переменную. В итоге мы получим данные которым нельзя доверять, а что еще хуже, это если эти самые данные нарушат работу внешнего оборудования. Более правильным, на мой взгляд, будет проверка значений по конкретно определенным адресам. Например, мы знаем, что в 16 байте должно быть значение 0xAA и если оно действительно там, то мы убеждаемся, что это наша информация. Естественно, что контрольных точек может быть несколько и разумеется с разными значениями, это увеличит гарантию того, что данные являются нашими, но 100% гарантии не даст. Для более серьезных проектов есть более серьезные методы, например, подсчет контрольной суммы всего набора данных. Также структура может иметь вложенные структуры, у нас ими являются: ip, subnet, gateway, dns. Вы можете отказаться от такого варианта и записывать данные просто в массив байт, как это было сделано с MAC адресом. Естественно, что обращаться к этим полям нужно по-разному. Запись данных в поле subnet config.subnet = {255, 255, 255, 0}; Запись данных в поле mac byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}; memcpy(config.mac, mac, 6); С записью данных в поле server все еще проще config.server = "mqtt.it4it.club"; Функция, которая возвращает нашу структуру данных с полностью заполненными полями. // Начальный конфиг configObj defaultConfig() { configObj config = { {192, 168, 0, 200}, {255, 255, 255, 0}, {192, 168, 0, 1}, {192, 168, 0, 1}, {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}, 0xAA, // Не трогать! Используется для проверки конфигурации в EEPROM F("mqtt.it4it.club"), F("arduino/serial/config") }; return config; } К примеру, два последних значения записывать не обязательно, тогда эти поля останутся пусты если использовать данную функцию для возврата к "заводским" настройкам. Вот пример того, как используя описанную нами структуру, мы проверяем целостность настроек в EEPROM и в случае не совпадения hex значений, загружаем настройки по умолчанию. const byte startingAddress = 9; bool configured = false; void loadConfig() { EEPROM.get(startingAddress, config); if (config.hex == 170) configured = true; else config = defaultConfig(); configEthernet(); // Функция производящая настройку сети } Как контроллеру начать понимать, что от него хотят В Arduino имеется функция, вызываемая каждый раз, когда в передаваемый буфер данных попадает знакомый нам символ перевода строки. void serialEvent() { // Вызывается каждый раз, когда что-то прилетает по UART // Данные передаются посимвольно. Если в строке 100 символов, то функция будет вызвана 100 раз } И в контексте обсуждаемой нами программы, мы можем представить ее в следующем виде void serialEvent() { serialEventTime = millis(); if (console.available()) { char c = (char)console.read(); if (inputCommands.length() < inputCommandsLength) { if (c != '\n') inputCommands += c; else if (inputCommands.length()) inputCommandsComplete = true; } } } Её задача, символ за символом, собрать в кучу все переданные нами данные и при получении заветного символа перевода строки (именно он даст нам понять, что передача сообщения завершена) сообщить, что команда получена и передать накопленный буфер данных своей напарнице по цеху. Но перед тем как это сделать стоит рассмотреть альтернативную ветку развития событий, а именно тот факт, что нам попросту могут прислать огромную, кучу шлака без волшебного символа, а раз могут, значит рано или поздно пришлют. И мы бесполезно потратим ценные ресурсы микроконтроллера, что может привести к непредсказуемым результатам в дальнейшем. Поэтому, в логику функции, мы добавим дополнительное ограничение на количество переданных символов, если оно достигнуто, то попросту перестаем воспринимать последующие данные. Останется только избавиться от них, и самым удобным моментом будет, когда этот поток шлака прекратиться. Чтобы об этом узнать мы будем запоминать время, когда пришел каждый из символов переданной строки перезаписывая соответствующую временную переменную данными о следующем символе и т.д пока поток не иссякнет. И как только расхождение текущего времени CPU и времени, когда поступил последний символ превысит некоторое значение, пусть это будет 1 секунда, мы очистим нашу память. Этот простой механизм напоминающий амнезию позволит избавить нас от лишних проблем. Переменная отвечающая за размер принимаемого буфера const byte inputCommandsLength = 60; Теперь можно переходить к напарнице предыдущей героини и, по совместительству, основной рабочей лошадки - функции обрабатывающей адекватно полученные данные. void serialEventHandler() { // вызывается в loop и проверяет взведена ли переменная inputCommandsComplete // в полученных данных пытается распознать команды } По началу я хотел описать данную функцию в упрощенном варианте, но в процессе понял, что ничего хорошего из этого не выйдет, и я решил описать только ключевые моменты, но их будет достаточно, на мой взгляд. Разбор serialEventHandler Полученные данные будут переданы нам в переменной inputCommands с типом String В первую очередь стоит почистить ее от лишних пробельных символов. Они часто встречаются в начале и в конце строки если пользователь копирует текст, а не набирает его самостоятельно. Это распространенная ситуация, приводящая к отказу принятия команды и бороться с ней очень просто. inputCommands.trim(); Далее стоит отсеять команды, не несущие никакой динамической информации, например, help, restart, reset и т.п это предписывающие команды которые заставляют контроллер выполнять строго описанные функции без вмешательства в их работу. if (inputCommands == F("help")) { consoleHelp(); } else if (inputCommands == F("restart")) { resetFunc(); } else { // Все сложные команды обрабатываются в этом блоке } Как Вы видите, все очень просто и скучно. Но не в том случае если команда динамическая, то есть содержит не только саму команду (заголовок) но и полезную нагрузку (параметр) которая может меняться раз от раза. Простой пример это команда изменения ip адреса и её варианты: ip 37.140.198.90 ip 192.168.0.244 ip 10.10.10.88 В данном случае, нам стоит понять, относится ли данная команда именно к ip адресу. Для этого в наборе String имеется отличный метод, позволяющий производить сравнение переданного ему параметра с началом строки. if (inputCommands.startsWith(F("ip"))) { // Строка inputCommands начинается с пары символов "ip" } Если все идет так, как мы задумали, то нам стоит отделить динамическую часть - наш параметр, от заголовка и получить полезную нагрузку. В этом нам поможет, опять же из набора String, метод substring позволяющий получать часть строки с указанием начального и конечного символа подстроки. Последний параметр указывать не обязательно и в таком случае мы получим всю строку начиная с указанного символа. inputCommands.substring(4) В данном случае начиная с 4-его и заканчивая последним. И как Вы успели заметить, отсчет мы начинаем не с третьего символа, что соответствует нашей строке без вступительного "ip", а на один больше т.к между заголовком и параметром имеется разделяющий символ в виде пробела. Далее, полученную строку мы передадим в функцию, занимающуюся разбором на компоненты и принимающую следующие параметры: Указатель на переменную с типом char, для этого нам потребуется преобразовать наш тип String Символ разделителя, что для IPv4 является точка "." Указатель на массив типа byte, которому будет присвоен результат разбора Количество искомых элементов в строке И система счисления, подразумеваемая в качестве исходной для записи элементов подстроки /* Парсинг https://stackoverflow.com/questions/35227449/convert-ip-or-mac-address-from-string-to-byte-array-arduino-or-c */ void parseBytes(const char* str, char sep, byte* bytes, int maxBytes, int base) { for (int i = 0; i < maxBytes; i++) { bytes[i] = strtoul(str, NULL, base); str = strchr(str, sep); if (str == NULL || *str == '\0') break; str++; } } В нашем случае выглядеть это будет следующим образом byte ip[4]; parseBytes(inputCommands.substring(4).c_str(), '.', ip, 4, 10); А дале все становится еще проще, попросту проверить попадает ли наш ip адрес, в список правильных адресов. И самой простой проверкой послужит проверка первого байта адреса на несоответствие не угодным нам сетям (0, 127, 255) if (ip[0] != 127 and ip[0] != 255 and ip[0] != 0) { // Производим необходимые нам действия с ip адресом, например, запись в конфиг config.ip = {ip[0], ip[1], ip[2], ip[3]}; } Вы в праве реализовать собственные проверки, какие только душе угодны. Также хотелось бы отметить, что обрабатывать некоторые параметры проще и быстрее через их короткие записи. К таким можно отнести маску подсети устройства. Например, привычный дня нас адрес 192.168.0.1 с маской подсети 255.255.255.0 можно записать в виде 192.168.0.1/24, где цифра 24 указывает нашу подсеть в краткой форме. А, следовательно, мы можем записать несколько кратких форм масок подсети в следующем виде: subnet 255.255.255.0 или subnet 24 subnet 255.255.0.0 или subnet 16 subnet 255.0.0.0 или subnet 8 Это основные маски, и я не описывал все существующие т.к в этом нет нужды, но если Вам интересно, то почитать про них можно в wikipedia. if (inputCommands.startsWith(F("subnet"))) { String input = inputCommands.substring(8); if (input == F("24")) config.subnet = {255, 255, 255, 0}; else if (input == F("16")) config.subnet = {255, 255, 0, 0}; else if (input == F("8")) config.subnet = {255, 0, 0, 0}; else { // Все остальные маски попадают в этот блок byte subnet[4]; parseBytes(input.c_str(), '.', subnet, 4, 10); config.subnet = {subnet[0], subnet[1], subnet[2], subnet[3]}; } } MAC адрес хранится у нас в виде массива байт. Его перезапись другим массивом производится с помощью функции memcpy if (inputCommands.startsWith(F("mac"))) { byte mac[6]; parseBytes(inputCommands.substring(4).c_str(), ':', mac, 6, 16); memcpy(config.mac, mac, 6); } Изменение адреса MQTT сервера if (inputCommands.startsWith(F("server"))) { String server = inputCommands.substring(8); server.trim(); if (server.length() < 40) server.toCharArray(config.server, 40); } В принципе теперь понятно, как производить получение, разбор и сохранение конфигурации в EEPROM микроконтроллера. Как это выглядит на практике Заливаем программу в микроконтроллер и подключаемся к Arduino по usb или через переходник. Открываем терминал и нас приветствуют краткой справкой с описанием доступных команд. - --------------------------------------------------------------------------------------- # Sensor with data sending to mqtt server (c) it4it.club # Use the "config" command to view the current configuration # To change the configuration, specify the parameter name and its new value with a space, # for example "ip 192.168.0.200", "subnet 255.255.255.0" or "mac AA:BB:CC:DD:EE:FF" # You can also specify a subnet using the mask 24, 16 or 8 # Additional commands: # sensors - view current data from sensors # config - view current configuration # save - saves the current configuration # reset - resets all settings # restart - restarts the device # eeprom clear - removes all contents of eeprom # help - view this help - --------------------------------------------------------------------------------------- Т.к. в EEPROM микроконтроллера не была обнаружена конфигурация (волшебный hex байт нам подсказал), то были задействованы стандартные настройки. Просмотреть текущую конфигурацию можно командой config config # ip: 192.168.0.200 # subnet: 255.255.255.0 # gateway: 192.168.0.1 # dns: 192.168.0.1 # mac: 00:AA:BB:CC:DE:02 # server: mqtt.it4it.club # topic: arduino/serial/config чтобы изменить значение любого из этих параметров необходимо передать имя параметра и его новое значение, разделенные между собой пробелом. ip 10.10.10.99 # ok gateway 10.10.10.1 # ok dns 10.10.10.1 # ok После окончания конфигурации необходимо сохранить настройки и если были затронуты критические параметры, например, сеть, то перезапустить Arduino соответствующей командой. save # ok restart # ok # restarting device... Если параметр был успешно принят, то контроллер ответит нам "ok", а в противном случае ругнется. ip 127.0.0.1 # bad ip Также мы получим негативный ответ если команда не была распознана. qwerqwer1243 # bad command С остальными командами Вы разберетесь самостоятельно. Исходник: MQTT_CLIENT_328_SERIAL_CONFIG.zip PS: в общем то это статья родилась только для того, чтобы в соседнем форуме с системой мониторинга Zabbix появилась ссылка на устройство, но я надеюсь, что она также станет полезна любителям домашней автоматизации и не только.
  8. В данной заметке мы рассмотрим, как можно производить мониторинг прокси-сервера Squid через Zabbix сервер по протоколу SNMP. Предполагается, что у Вас уже имеется работоспособный сервер c ip адресом 192.168.0.11 В моём случае обкатка производилась на: Linux Ubuntu 14.04Squid 3.3.8Zabbix 2.4Дополняем файл конфигурации Squid 1. Указываем, какие интерфейсы и порт использовать для поднятия SNMP snmp_incoming_address 192.168.0.11 snmp_outgoing_address 192.168.0.11 snmp_port 21612. Правим ACL. Указываем необходимый community и ip адрес Zabbix сервера. acl snmp_monitoring snmp_community public acl snmp_client src 192.168.0.23. Пускаем Zabbix к Squid и блокируем всех остальных. snmp_access allow snmp_monitoring snmp_client snmp_access deny all4. Сохраняем изменения в конфиге и проверяем его на отсутствие ошибок. squid3 -f /etc/squid3/squid.conf -k parse5. Перезапускаем прокси-сервер. service squid3 restart6. Проверяем, прослушивает ли Squid порт 2161 netstat -a | grep 2161На этом настройка прокси-сервера завершена. На всякий случай оставляю ссылку на сайт разработчика, где указаны различия в разных версиях Squid: http://www.squid-cache.org/Doc/config/ Сам сервер заботливо оставил нам MIB файл с описанием своей кухни: /usr/share/squid3/mib.txtПосле его изучения, можно накидать начальный шаблон для Zabbix Squid-Template.zip Для наблюдаемого узла сети можно добавить два макроса: {$SNMP_SQUID_COMMUNITY} = public {$SNMP_SQUID_PORT} = 2161Это необходимо если Вы хотите изменить настройки community или port. По умолчанию, данные макросы уже указаны в настройках шаблона. Список собираемых параметров: Squid Config Cache Administrator E-Mail addressCache Software NameCache Software VersionCache Swap High Water MarkCache Swap Low Water MarkCache unique host nameLogging FacilityThe total of the cache_dir space allocated in MBThe value of the cache_mem parameter in MBSquid Dns Number of external DNS server processesNumber of external DNS server repliesNumber of external DNS server requestsSquid Fqdn Cache FQDN Cache entriesNumber of blocking gethostbyaddr requestsNumber of FQDN Cache hitsNumber of FQDN Cache missesNumber of FQDN Cache negative hitsNumber of FQDN Cache pending hitsNumber of FQDN Cache requestsSquid Ip Cache IP Cache EntrieNumber of attempts to release locked IP Cache entrieNumber of blocking gethostbyname requestsNumber of IP Cache hitsNumber of IP Cache missesNumber of IP Cache negative hitsNumber of IP Cache pending hitsNumber of IP Cache requestsSquid Median Svc Table (1/5/60) Byte Hit RatiosDNS serviceHTTP all serviceHTTP hit not-modified serviceHTTP hit serviceHTTP miss service timeHTTP refresh hit service timeICP query service timeICP reply service timeRequest Hit RatiosSquidSystem Storage Mem size in KBStorage Swap size in KBThe Uptime of the cache in timeticksВАЖНО: Это тестовый шаблон, который должен послужить отправной точкой для реализации Ваших идей и мы будем очень признательны, если Вы поделитесь с нами своими наработками.
  9. Доброе время суток. Более года назад мне потребовалось выдергивать карты сетей из web интерфейса zabbix, но эта потребность была не долгой, и вскоре все было забыто. И вот недавно, разбирая закрома, наткнулся на реализацию этой идеи. Зачем это нужно? Большинству людей, пользующихся системами мониторинга, достаточно того интерфейса, который предоставляет разработчик. А разработчик обычно останавливается на реализации web интерфейса. Можно забыть про всякие виджеты, push уведомления или иные способы оповещения "из коробки". Это сильно угнетает т.к у меня нет возможности постоянно смотреть на дашборд в ожидании каких либо событий. Да и вообще я могу быть погруженным в другие людские заботы или, что еще боле серьезное, отсутствовать на рабочем месте. Чтобы как-то исправить две последние ситуации были реализованы следующие дополнения Push уведомления: Android, iOS, Windows - очень удобно получать информацию о проблемных узлах прямо на телефон. Порой решения проблемы приходят в голову быстрее, чем кто-либо еще о ней узнает. Мониторинг триггеров в GUI под Windows - пока что сырая, но вполне работоспособная система позволяющая получать всплывающие уведомления, сопровождающиеся звуковым оповещениям и интерфейсом для быстрого доступа к узлу. Теперь захотелось пойти немного дальше и позволить удаленным приложениям забирать актуальные карты сетей по их идентификатору в zabbix интерфейсе. А также в планах вывести общую карту сети на большой монитор для всех коллег. И делать это, хотелось бы, не светя учетными данными пользователей zabbix и не нагружая сам сервер. В общем, эта мелочь будет описана в данной теме. И так, что нам понадобится. Т.к наличие zabbix подразумевает наличие web сервера и PHP, то вы даже не догадаетесь, на чем мы все будем писать? или догадаетесь? ... эээ блин! Первым делом нам необходимо дополнить арсенал PHP модулем CURL. В данный момент у меня все это хозяйство крутиться на Ubuntu 16.04 с PHP-7.1 и добавить модуль можно следующим способом. sudo apt-get update sudo apt-get install php7.1-curl sudo /etc/init.d/apache2 reload Создаем на нашем web сервере, в произвольном месте, файл graphics.php со следующим содержимым <?PHP if(false) { ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); } $settings = array( 'request' => '', 'name' => 'guestlogin', 'password' => 'guestpassword', 'autologin' => '', 'enter' => 'Sign in' ); function putImage($data = false) { header('Content-Type: image/png'); header('Content-Transfer-Encoding: binary'); if($data) echo $data; } if(isset($_GET['sysmapid']) and preg_match('/^[0-9]{1,2}$/', $_GET['sysmapid'])) { $imageUrl = 'http://localhost/zabbix/'; $imageTmp = base64_encode(microtime(null)); $imagePng = '/tmp/zabbixTrigger_map'.$_GET['sysmapid']; $cookie = '/tmp/zabbixTrigger_cookie'; if(file_exists($imagePng)) { if(time() - filemtime($imagePng) < 30) { putImage(); exit(file_get_contents($imagePng)); } unlink($imagePng); } $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $settings); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); $post = (file_exists($cookie)) ? 'map.php?sysmapid='.$_GET['sysmapid'] : 'index.php'; curl_setopt($ch, CURLOPT_URL, $imageUrl.$post); $data = curl_exec($ch); if(curl_getinfo($ch, CURLINFO_CONTENT_TYPE) != 'image/png') { curl_setopt($ch, CURLOPT_URL, $imageUrl.'map.php?sysmapid='.$_GET['sysmapid']); $data = curl_exec($ch); file_put_contents($imageTmp, $data, LOCK_EX); $finfo = finfo_open(FILEINFO_MIME_TYPE); if(finfo_file($finfo, $imageTmp) == 'image/png') { file_put_contents($imagePng, $data, LOCK_EX); putImage($data); } else echo 'error'; unlink($imageTmp); } else { file_put_contents($imagePng, $data, LOCK_EX); putImage($data); } curl_close($ch); } ?> Что здесь происходит. Скрипт пытается авторизоваться на zabbix сервере. Советую, для этих целей, использовать гостевую учетную запись. И минуя прочий html шлак, забирает картинку по её идентификатору. Как узнать идентификатор нужной нам карты сети? Для этого откройте карту в дашборд zabbix, и в строке запроса, вы увидите её порядковый номер. Нас интересует переменная sysmapid, именно её мы будем использовать для передачи идентификатора для graphics.php Теперь о том, как передать данные для авторизации гостевой учетной записи. $settings = array( 'request' => '', 'name' => 'guestlogin', 'password' => 'guestpassword', 'autologin' => '', 'enter' => 'Sign in' ); Данный массив представляет собой список всех форм участвующих в авторизации пользователя. И пусть Вас не пугает их количество, на самом деле их ровно столько, сколько в самом интерфейсе zabbix. Вам необходимо исправить только поля с именем пользователя и пароля. Жизненно необходимо указать http путь до zabbix сервера, это делается в переменной $imageUrl = 'http://localhost/zabbix/'; Также имеются переменные, описывающие, где будут храниться временные файлы изображений и cookie на нашем сервере $imagePng = '/tmp/zabbixTrigger_map'.$_GET['sysmapid']; $cookie = '/tmp/zabbixTrigger_cookie'; Скрипт кэширует изображения во временном каталоге и отдает его, если не прошло более 30 секунд с момента его создания. Также во временном каталоге будет храниться файл cookie необходимый для работы curl. ВАЖНО: не переносите эти файлы в рабочий каталог web сервера! Таким образом, мы забираем у zabbix карты сетей без передачи какой либо конфиденциальной информации. Можно дополнить скрипт и отдавать только определенные карты и только конкретным хостам. В общем, есть почва для размышлений.
  10. Наткнулся я тут на своём ZABBIX на поблемку выдаваемую, когда пытаешься прокладывать трассу до хоста в вэб-интерфейсе: Смена прав доступа к утилите traceroute не помогла. Выяснилось всё дело в SUID . И трасса пошла. Как это отразится на безопасности, пока не представляю.
  11. Делюсь шаблоном для мониторинга состояния маршрутизаторов CISCO, zabbix 2.4 Работа с устройством реализована по протоколу SNMP и тут есть ряд подводных камней, но самый основной это изменения стандарта от одной версии прошивки к другой. Если понадобится изменить OID значения, то поискать их можно тут http://tools.cisco.com/Support/SNMP/do/BrowseOID.do но часть старый параметров в базе отсутствует. Тут уж или через поисковик или "Селяви, что в перевод с древнегреческого - не повезло!". Простая конфигурация устройства: cisco-test#configure terminal Enter configuration commands, one per line. End with CNTL/Z. cisco-test(config)#snmp-server community public RO cisco-test(config)# Но при этом любой может подключиться к устройству и читать с него данные, если вы хотите чтобы плохие люди могли еще и отдавать команды то RO необходимо заменить на RW Если Вы желаете ограничить доступ к SNMP серверу устройства по IP, то необходимо использовать access-list: cisco-test#configure terminal Enter configuration commands, one per line. End with CNTL/Z. cisco-test(config)#ip access-list standard SNMP_ACCESS_RO cisco-test(config-std-nacl)#permit 192.168.1.2 cisco-test(config)#snmp-server community public RO SNMP_ACCESS_RO cisco-test(config)#^Z cisco-test# Сommunity можно обозвать как угодно, хоть BLABLABLA место public. IP естественно заменить на адрес Вашего сервера. RO - только чтение, RW - полный доступ Мы будем только читать, поэтому RO. В теории конечно можно отлавливать определенные события на устройстве и предпринимать ответные действия автоматически, только в таких случаях RW. Но об этом мы поговорим в другой раз. Теперь необходимо добавить макрос в zabbix Администрирование -> Общие -> Макросы {$SNMP_COMMUNITY} = имя community указанное в конфигурации CISCO, например "public" Сам шаблон можно забрать в конце поста. Немного о шаблоне. На данным момент собираются данные: Аптайм Модель маршрутизатора Загрузка центрального процессора за: 5 секунд, 1 минуту, 5 минут Статус (online\offline) Память: ОЗУ, ПЗУ Список доступных интерфейсов Статусы сетевых интерфейсов Количество byte RX\TX на каждом интерфейсе Количество error byte RX\TX на каждом интерфейсе По этим данным строятся соответствующие графики (ОЗУ, ПЗУ и т.п не выведены, можете добавить самостоятельно) Пока маловато триггеров, но по мере обновления шаблона, их количество увеличится: Маршрутизатор выключен или с ним нет связи по Ethernet Маршрутизатор был пере запущен менее 5 минут назад Нагрузка на ЦП выше 80% PS: следите за обновлениями! zbx_templates_router_cisco.xml
  12. На самом деле тривиальная задача, но задумался я о ней только после того, как товарищи из соседнего отдела начали бегать сломя голову вокруг нагруженного сервера с базой. Что-то работало не так... Через некоторое время выяснилось, что на КПД системы влияют медленные запросы, и они крутятся не один год. В один прекрасный день система, многократно окупающая сервер, на котором стоит, стала захлебываться. А ведь проблему можно было решить еще до её проявления, не прибегая к мозговому штурму. Начинаем действовать Беглое погружение в просторы интернета приводят нас на официальный сайт MySQL где черным по "Русски" написано что в my.cnf имеется соответствующий раздел позволяющий настроить логирование для медленных запросов. http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html # Here you can see queries with especially long duration log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 2Тут все ясно с одного взгляда. Превысил установленный лимит времени на выполнение, улетел в лог. Остается дело за малым - отследить изменения в файле и поднять тревогу В Zabbix имеется набор функций для отслеживания log файлов, но я не вижу смысла читать его построчно. Думаю, что достаточно просто смотреть на контрольную сумму. Для этих целей в Zabbix предусмотрена функция vfs.file.cksum, которой необходимо передать путь до файла. В нашем случае ключ выглядит следующим образом vfs.file.cksum[/var/log/mysql/mysql-slow.log]Останется только создать триггер проверяющий, отличаются ли два последних значения друг от друга и поднимающий тревогу, если они различаются. {<template-name>:vfs.file.cksum[/var/log/mysql/mysql-slow.log].diff()}=1Значение <template-name> замените на имя Вашего шаблона, если вы решили добавить отслеживание медленных запросов mysql к уже имеющемуся у Вас шаблону. На выходе получаем Замечание Если перезапустить сервер баз данных, то поднимется тревога т.к в лог свалится запись о перезапуске сервера. Но этого можно избежать если дополнительно контролировать время прошедшее с момента запуска mysqld. PS: конечно я понимаю, что лепить это в отдельный шаблон смешно, но вдруг у кого ни-ть возникнут трудности =) MySQL-Slow.zip
  13. Push уведомления - очень удобное, даже жизненно необходимое, дополнение к серверу. В любом месте на планете мы получаем оперативную информацию с поля боя. Для реализации задуманного есть очень удобный ресурс pushbullet.com с простым API. Забегая немного вперед, сразу покажу как это хозяйство будет выглядеть. Android Windows На момент написания статьи, сервис поддерживает следующие платформы для получения push уведомлений: AndroidiOSWindowsChromeFirefoxOperaSafariДумаю, что в скором времени и Mac добавится к списку. И так, к делу Все работы я проводил на Linux Ubuntu Server 4.8 и Zabbix 2.4, но описанное подойдет для любой ОС семейства UNIX, а под Windows лишь с небольшими модификациями. Первым делом нам необходимо перейти на сайт pushbullet (ссылка в начале поста) и пройти регистрацию или авторизоваться под одной из предоставленных систем: google, facebook ... В общем есть из чего выбирать. Привязать необходимую платформу для получения уведомлений можно в разделе Devices -> Add device. Для установки Вас перенаправят на ресурс соответствующий вашему выбору. Устанавливаем, авторизуемся и возвращаемся на сайт в раздел Settings -> Account. Ищем графу Access Token и, если у Вас хорошая память, запоминаем или переписываем секретный ключ. Самое тяжелое позади, переходим к изучению API Необходимый багаж знаний мы можем получить в соответствующем разделе сайта docs.pushbullet.com Раздел Pushes гласит, что мы можем отправлять запросы методом POST/GET и использовать следующие типы запросов с сопутствующими параметрами: На момент написания статьи, ссылка по которой реализована работа с API выглядит так - https://api.pushbullet.com/v2/pushes В документации приведен пример для отправки тестового push уведомления методом POST с использованием Curl в формате Json. curl --header 'Authorization: Bearer <your_access_token_here>' \ -X POST https://api.pushbullet.com/v2/pushes \ --header 'Content-Type: application/json' \ --data-binary '{"type": "note", "title": "Note Title", "body": "Note Body"}'Для теста замените <your_access_token_here> на свой секретный ключ. Это довольно удобно, но у меня возникли проблемы в реализации связки Zabbix -> Bash -> Curl+Json, при которой наблюдались перебои в работе. Поэтому я выкинул из связки Json. Устремляемся на сервер Идем в каталог со скриптами оповещений Zabbix (в Linux это /usr/local/share/zabbix/alertscripts) и создаем там файл с любым именем, но для удобства понимания назовем его pushbullet. Это будет простенький Bash скрипт со следующим содержимым: #!/bin/bash API_URL="https://api.pushbullet.com/v2/pushes" API_KEY="$1" SUBJECT="$2" MESSAGE="$3" curl $API_URL -u $API_KEY: -d type=note -d title="$SUBJECT" -d body="$MESSAGE" -X POST Переходим в Zabbix В разделе Администрирование -> Способы оповещения и добавляем новый способ со следующими параметрами: Имя - pushbulletТип - СкриптИмя скрипта - pushbulletИдем в раздел Настройка -> Действия -> Источник событий: Триггеры и создаем новое действие с именем Report problems to Pushbullet. Активируйте и отредактируйте Сообщение по умолчанию и Сообщение о восстановлении, это поможет получать как список самих проблем так и сообщения при их устранении. Далее в разделе Операции указываем Тип операции: отправлять сообщение и выбираем отправлять только через pushbullet. Можно отредактировать через стандартный шаблон оповещений, но отдельный шаблон позволяет создать конкретное сообщение, что очень удобно т.к например на телефоне не большой дисплей и плавать во всем шлаке данных о проблеме будет не удобно. Что выбрать решать только Вам. Теперь самое вкусно. Переходим в раздел Администрирование -> Пользователи и выбираем нашу учетную запись. Во вкладке Оповещения добавляем новое оповещение со следующими параметрами: Тип - pushbulletОтправлять на - указываем <your_access_token_here>Остальные параметры по желанию, но по личному опыту советую изменить активность на Ваше рабочее время. Я уже получал посреди ночи пулеметную очередь уведомлений с последующими одиночными выстрелами. Таким образом настраиваются уведомления для всех необходимых пользователей. Все готово к работе. PS: По желанию Вы можете модифицировать скрипт и профили пользователей для получения уведомлений на конкретные устройства или распределить между устройствами оповещения в зависимости от текущего времени дня (на рабочий телефон в рабочее время, на домашний компьютер/телефон в свободное). Выбор остается за Вами.
  14. Речь пойдет о мониторинге источников бесперебойного питания, в моём случае SMART-UPS 5000 RM, по протоколу SNMP. Версия Zabbix 2.4. Использовать Ethernet для этих целей очень выгодно т.к это избавляет от лишнего звена в виде компьютера подключенного по COM или USB, но ИБП должен быть укомплектован сетевой платой Apc Network Management Card (NMC). У меня все прекрасно заработало на ИБП: SMART-UPS 1000\1500\5000\8000. Уверен, что все получится и с другими моделями. Доступное мне оборудование использует NMC: AP9617, AP9619, AP9631. И так, к делу. Первоначально необходимо произвести сброс настроек NMC. На лицевой стороне NMC есть еле заметное отверстие с красующейся надписью Reset. Ковырять там, разогнутой скрепкой, можно на работающем устройстве. Я использовал два вида кабелей COM to COM - ID 940-1524D USB to COM - ID 940-0272A Для подключения можно использовать как специализированный софт, так и обычный терминал. Я использовал PuTTY, что и Вам советую. Со скоростью поэкспериментируйте (у меня диалог с железкой завязался на 2400). После подключения жмем Enter и появляется запрос на авторизацию. По умолчанию логин и пароль: apc Настройка реализована в виде диалога с вариантами ответа как в дешевой квест-рпг игре. Пример начального квеста: Теперь продолжить настройку ИБП можно через Web интерфейс. Там все еще проще, описывать нет смысла, главное настройте SNMP COMMUNITY. Переходим к Zabbix. Для начала необходимо создать макрос {$SNMP_COMMUNITY} со значением SNMP COMMUNITY которое выставлено в настройках ИБП. Теперь необходимо пройти в Администрирование -> Общие -> Преобразование значений и импортировать список преобразований. Соответствующий файл есть в архиве. Без этих таблиц, во время импортирования шаблона вылетит ошибка и операция будет остановлена. Теперь можно импортировать сам шаблон, он как всегда, во вложении к данному посту. Что имеется на данные момент: Элемента данных Версия прошивки микропроцессора Верхний порог (V) для перехода на работу от батареи Время, прошедшее с момента как ИБП перешел на работу от батареи Входное максимальное зарегистрированное напряжение Входное минимальное зарегистрированное напряжение Входное напряжение Выходная потребляемая нагрузка в амперах Выходное напряжение Индикатор замены батареи Модель устройства Напряжение батареии Нижний порог (V) для перехода на работу от батареи Оставшееся время автономной работы Причина последнего перехода на работу от батареи Серийный номер микропроцессора Статус ONLINE\OFFLINE Статус батареи Текущая нагрузка Текущее состояние ИБП Температура батареи Температура внутри ИБП Уровень заряда батареи Частота входной линии Частота выходной линии Триггеры ИБП: Работает от батареи ИБП: батарея в аварийном состоянии ИБП: батарея разряжена ИБП: выключен или с ним нет связи по Ethernet ИБП: заряд батареи менее 25% ИБП: заряд батареи менее 50% ИБП: заряд батареи менее 75% ИБП: зафиксирован высокий скачек напряжения на входной линии ИБП: зафиксировано сильное падение напряжения на входной линии ИБП: нагрузка превысила 80% ИБП: нагрузка превысила 85% ИБП: нагрузка превысила 90% ИБП: нагрузка превысила 100% ИБП: необходимо заменить батарею ИБП: температура батареи превысила 40 градусов С Графики Входное и выходное напряжение Нагрузка (A, %) Оставшееся время автономной работы Состояние батареи Частота входной и выходной линии (Гц) Ниже добавлю несколько изображений с графиками, но для полноты данных они взяты уже не с 5000 серии, а с 1500. PS: Хочу добавить, что некоторые данные могут не поступать, например температура батареи. Это, как я понял, зависит от комплектации конкретного ИБП.
×
×
  • Create New...