Перейти к содержанию

Использование Housekeeper для сбора данных с устройства

Время от времени требуется собирать данные с оборудования, отсутствующие в системе. После сбора необходимо заполнить кастомное поле (custom field) или отправить уведомление по доступному каналу: почта, телегам и т.д.

Решение

Для подобных случаев хорошо подходит механизм Housekeeper. Он позволяет в конце полного опроса (box discovery) запустить пользовательскую функцию (handler) в которую будет передано устройство, что позволит выполнять разнообразные действия.

Ограничения:

  • Если в ходе опроса произойдёт фатальная ошибка и он будет остановлен, то функция запущена не будет
  • Расширения схемы данных не предусмотрено - если какого-либо поля нет в схеме данных (модели), то заполнить его всё равно не получится.

Реализация функций-обработчиков

/opt/noc_custom/handlers/hks.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Python modules
import re

# NOC modules
from noc.core.mx import send_message, MessageType
from noc.sa.models.managedobject import ManagedObject
from noc.inv.models.subinterface import SubInterface

MGMT_VLAN_CAPS = "Management | VlanID"
IPv4 = "IPv4"


def handler_mgmt_vlan(object: ManagedObject) -> None:
    """
    Scan for an device management IP through the subinterfaces.
    If the sub is found look for `vlan_id` field. The VLAN found
    is considered as management vlan and stored in the
    `Management | VlanID` capability.
    """
    re_addr = re.compile(f"{object.address}.+")
    msub = SubInterface.objects.filter(
        ipv4_addresses=re_addr, managed_object=object, enabled_afi=IPv4, vlan_ids__exists=True
    ).first()
    if not msub or not msub.vlan_ids:
        return
    mgmt = object.get_caps(MGMT_VLAN_CAPS)
    if mgmt == msub.vlan_ids[0]:
        return
    object.set_caps(MGMT_VLAN_CAPS, msub.vlan_ids[0], source="manual")


def handler_vlans_script(object: ManagedObject) -> None:
    """
    Execute `get_vlans` script and sent the result as the message.
    """
    r = object.scripts.get_vlans()
    if not r:
        return
    # Add the label to use in condition
    send_message(
        r,
        message_type=MessageType.EVENT,
        headers=object.get_mx_message_headers(["custom_data"]),
    )


def hk_handler(job):
    """
    Housekeeper Entrypoint
    """
    mo: ManagedObject = job.object
    handler_mgmt_vlan(mo)
    handler_vlans_script(mo)

Код необходимо расположить в /opt/noc_custom/handlers/hks.py

Регистрация обработчика в системе

Регистрация обработчиков производится в меню Главное (Main) -> Настройки (Setup) -> Обработчики (Handlers). Регистрация обработчика в системе

  1. В панели навигации преходим в меню (Main) -> Настройки (Setup) -> Обработчики (Handlers)
  2. Нажимем кнопку добавить (Add) справа от строки поиска
  3. В форме добавления заполняем:

    • Имя (Name) - может быть любым понятным пользователю
    • Ссылка (Handler) ссылку на функцию-обработчик (расположен в папке /opt/noc_custom/handlers/hks.py)
    • Отмечаем галочку Allow housekeeping для разрешения использовать как Housekeeper

Добавление кастомного поля

Добавление собственных полей производится в меню Учёт объектов (Inventory) -> Настройки (Setup) -> Свойства (Capabilities) Добавление нового Capabilities

  1. В панели навигации переходим в меню (Inventory) -> Настройки (Setup) -> Свойства (Capabilities)
  2. Нажимаем кнопку добавить (Add) справа от строки поиска
  3. В форме добавления заполняем:

    • Имя (Name) - Management | VlanID в нашем случае
    • Описание (Description) - Device management vlan
    • Тип (Type) - Integer

Настройка запуска

Настройки запуска находятся в профиле объекта Управление объектами (Managed Object) -> Настройки (Setup) -> Профили объекта (Object Profile)

  1. Выбираем соответствующий профиль обеъекта или добавляем новый
  2. Переходим на вкладку Box
  3. Снизу формы в выпадающем меню HouseKeeper выбираем соответствующий обработчик
  4. Нажимаем кнопку Сохранить

Настройка маршрутизации сообщения

Правила пересылки сообщений настраиваются в меню Главное (Main) -> Настройки (Setup) -> Маршрутизация сообщений (Message Route) Настройка пересылки сообщения пользователя

  1. В панели навигации переходим в меню Главное (Main) -> Настройки (Setup) -> Маршрутизация сообщений (Message Route)
  2. Нажимаем кнопку добавить (Add) справа от строки поиска
  3. Заполняем форму:

  4. Имя может быть любое

  5. Тип сообщения - Notification
  6. Match

Проверка работы

Проверить работу Housekeeper можно запуском опроса

./noc discovery run -c hk box MONAME

где MONAME имя устройства в системе.