SNMP: различия между версиями

Материал из Wiren Board
Строка 278: Строка 278:


= Контроллер как источник SNMP =  
= Контроллер как источник SNMP =  
 
Иногда нужно подучать с контроллера какие-то параметры по SNMP.
Для того чтобы иметь возможность передавать значения топиков настроим следующую схему:
== Установка и предварительная настройка пакетов ==
== Установка и предварительная настройка пакетов ==



Версия 10:49, 15 января 2021

SNMP (Simple Network Management Protocol) - стандартный протокол для управления сетевыми устройствами в IP-сетях.

Часто используется для обмена сервисной информацией с устройствами, представляя данные в виде отдельных переменных.

Поддержка протокола встречается в сетевых коммутаторах, маршрутизаторах, системах бесперебойного питания (UPS), серверах и т.п.

В Wiren Board добавлен драйвер для получения данных от SNMP-устройств. Для использования контроллера в качестве источника - настраивается snmpd/

Установка и настройка на контроллере

Установка

Сначала нужно установить пакет wb-mqtt-snmp. В консоли устройства вводим

apt update
apt install wb-mqtt-snmp

Настройка

Структура конфигурации очень похожа на wb-mqtt-serial.

Пример конфигурационного файла (/etc/wb-mqtt-snmp.conf):

{
    "debug": false,
    "num_workers": 4,
    "devices": [
        {
            "address": "192.168.0.1",
            "name": "My SNMP server",
            "community": "public",
            "oid_prefix": "SNMPv2-MIB",
            "channels": [
                {
                    "name": "Number of services",
                    "oid": "sysServices.0",
                    "poll_interval": 1000
                },
                {
                    "name": "Boot string",
                    "oid": "HOST-RESOURCES-MIB::hrSystemInitialLoadParameters.0",
                    "poll_interval": 10000
                },
                {
                    "name": "System location",
                    "oid": ".1.3.6.1.2.1.1.6.0"
                }
            ]
        },
        {
            "address": "test.net-snmp.org",
            "name": "Test SNMP server",
            "device_type": "test-snmp"
        }
    ]
}

Рассмотрим его несколько подробней.

Файл конфигурации

  • debug - флаг включения режима отладки. Если true, то в процессе работы демона в лог-файл будет выноситься также отладочная информация (по умолчанию - false);
  • num_workers - максимальное количество одновременно устанавливаемых SNMP-соединений.
    • Если опрашивается много SNMP-устройств, то увеличение этого параметра может ускорить опрос. Однако, увеличение этого параметра также увеличивает максимальную нагрузку на сеть. В общем случае можно оставить значение по умолчанию (4).
  • devices - список опрашиваемых устройств.

Описание устройства

Имя параметра Тип Описание Обязательный Значение по умолчанию
name string Имя устройства Нет SNMP [address]_[community]
id string ID устройства в MQTT Нет snmp_[address]_[community]
address string Сетевой адрес устройства Да -
device_type string Тип устройства (нужен для загрузки шаблона) Нет -
enabled bool Включить устройство в опрос? Нет true
community string Имя сообщества SNMP Да -
oid_prefix string Префикс (имя MIB) для текстовых OID каналов, где оный не указан явно Нет -
snmp_version string Версия SNMP (на сегодняшний день поддерживается только 2с) Нет 2c
snmp_timeout integer Время ожидания ответа (в секундах) Нет 5
poll_interval integer Минимальное время опроса для каждого канала по умолчанию Нет -
channels array Описание каналов устройства (переменных SNMP) Нет -

Описание каналов

Имя параметра Тип Описание Обязательный Значение по умолчанию
name string Имя канала Да -
oid string OID в числовом или текстовом виде Да -
enabled boolean Включить канал в опрос? Нет true
control_type string Тип данных (согласно Conventions) Нет text
units string Обозначение единиц измерения (для control_type == value) Нет -
scale float Множитель (для числовых значений) Нет 1.0
poll_interval int Минимальный интервал опроса канала (в мс) Нет poll_interval из описания устройства, либо 1000

Преобразование OID

При запуске демона происходит попытка преобразовать записанные в конфигурации текстовые OID в числовые.

Если OID представлен в числовом виде (начинается с точки: .1.2.3.4), никакого преобразования не происходит.

Если OID представлен в текстовом виде (например, SNMPv2-MIB::sysName.0), необходимо, чтобы в системе был установлен соответствующий MIB, содержащий описание этой переменной. Преобразование имён происходит с помощью вызова утилиты snmptranslate, так что можно проверить наличие MIB вручную с помощью команды

# snmptranslate -On yourOid

Параметр oid_prefix в описании устройства позволяет опустить имя MIB (префикс; SNMPv2-MIB::sysName.0). В этом случае префикс из oid_prefix будет автоматически присоединён ко всем OID каналов устройства, где явно не указан префикс. Например, при oid_prefix = SNMPv2-MIB:

  • sysName.0 -> SNMPv2-MIB::sysName.0
  • sysLocation.0 -> SNMPv2-MIB::sysLocation.0
  • HOST-RESOURCES-MIB::hrSystemUptime.0 -> HOST-RESOURCES-MIB::hrSystemUptime.0
  • .1.3.6.1.2.1.1.6.0 -> .1.3.6.1.2.1.1.6.0

Установка MIB

Если у Вас есть требуемый MIB-файл, то достаточно скопировать его в директорию /root/.snmp/mibs, предварительно создав её:

# mkdir -p /root/.snmp/mibs
# cp your-mibs-file.mib /root/.snmp/mibs

После этого проверьте правильность работы snmptranslate с каким-либо известным OID:

# snmptranslate -On yourOid

Шаблоны

Для описания устройств удобно (хотя и не обязательно) использовать шаблоны. Шаблон (тип устройства) - это внешний конфигурационный файл (располагается в /usr/share/wb-mqtt-snmp/templates и имеет имя config-[device-type-name].json, например, config-test-snmp.json), в котором содержится базовое описание устройства (например, имя сообщества SNMP) и базовое описание всех его каналов.

Для использования шаблона в описании устройства в конфигурационном файле укажите поле "device_type". Среди всех представленных шаблонов будет выбран шаблон с таким же значением device_type, при этом все поля, которые не были определены в конфигурационном файле, примут значения из шаблона.

Точно так же это работает с каналами. Сравнение каналов происходит по обязательному полю name; если имя канала из конфигурационного файла совпадёт с именем канала в шаблоне, из шаблона будут взяты все неуказанные значения.

Пример

Шаблон config-my-device.json:

{
    "device_type": "my-device",
    "community": "public",
    "channels": [
        {
            "name": "Channel 1",
            "oid": ".1.2.3.4.1"
        },
        {
            "name": "Channel 2",
            "oid": ".1.2.3.4.2",
            "poll_interval": 3000
        }
    ]
}

Конфигурационный файл:

{
    "devices": [
        {
            "name": "Device 1",
            "device_type": "my-device",
            "address": "192.168.0.5",
            "snmp_timeout": 1
        },
        {
            "name": "Device 2",
            "device_type": "my-device",
            "address": "my-device.example.org",
            "snmp_timeout": 5,
            "channels": [
                {
                    "name": "Channel 2",
                    "poll_interval": 10000
                }
            ]
        }
    ]
}

В данном случае мы описали один шаблон my-device, по которому определили два разных устройства Device 1 и Device 2 с одинаковым набором каналов.

Поскольку Device 1 находится в локальной сети, логично выставить ему небольшое значение таймаута, чтобы быстрее определить неисправность устройства. Все остальные настройки берутся из шаблона.

Device 2 - удалённый сервер, потому для него стоит увеличить таймаут, чтобы не считать устройство неисправным при задержке пакета. Более того, для канала Channel 2 здесь мы переопределяем интервал опроса на бОльший, чтобы снизить нагрузку на сеть.

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

Список шаблонов

В поставке wb-mqtt-snmp прилагается набор шаблонов для типовых устройств (список будет расширяться):

Устройство Имя шаблона Протестировано Комментарии
Тестовый сервер Net-SNMP test-snmp Да адрес тестового сервера test.net-snmp.org
APC UPS apc-ups Нет
  • Требуется локально установленный PowerNet-MIB
  • Описание устройства такое же, как в wb-mqtt-apcsnmp

Контроллер как источник SNMP

Иногда нужно подучать с контроллера какие-то параметры по SNMP. Для того чтобы иметь возможность передавать значения топиков настроим следующую схему:

Установка и предварительная настройка пакетов

Обновим источники и установим требуемое:

apt update && apt-get install snmp snmpd -y

Отредктируем основной конфиг демона

mcedit /etc/snmp/snmpd.conf

В секцию "# ACCESS CONTROL" дописываем строчку.

view   systemonly  included   .1.3.6.1.4.1.2021.8

и в конец файла строчку.

extend .1.3.6.1.4.1.2021.8 tt /var/lib/snmp/mqtt-snmp.sh

Добавление скрипта

Редактируем скрипт

mcedit /var/lib/snmp/mqtt-snmp.sh

Содерижимое:

#!/bin/sh
echo "mosquitto topics"
# voltage Vout
echo $(/usr/bin/mosquitto_sub -C 1 -t "/devices/wb-adc/controls/5Vout")
# voltage Vin
echo $(/usr/bin/mosquitto_sub -C 1 -t "/devices/wb-adc/controls/Vin")

Права на скрипт:

chmod a+rx /var/lib/snmp/mqtt-snmp.sh

Соответственно добавляем в этот скрпт нужные топики. Или создаем нескоько скриптов с разными наборами - для ускорения. перезапускаем демона:

systemctl restart snmpd && systemctl status snmpd

тестируем:

snmpwalk -On -v2c -c public 127.0.0.1 1.3.6.1.4.1.2021.8.4