Массовое добавление устройств в netdot с помощью API (pynetdot)

Продолжение этого поста.

Устройства удобно добавлять, имея их список в формате csv. Для добавления порядка ~ 350 устройств я подготовил файл с заголовком:

site_name;name;snmp_target;snmp_version;snmp_community;snmp_managed;entity_id

По заголовкам – в site_name вношу название объекта, где находится ИБП, name – имя устройства, snmp_target – ip-адрес, по которому устройство будет опрашиваться, snmp_version;snmp_community здесь всё понятно, snmp_managed – будет устройство управляться по snmp или нет, entity_id – id компании-владельца в нетдоте (например подрядчик или типа того). csv удобно обрабатывать с помощью библиотеки csv, выглядит это примерно так:

ups_name = row[‘name’]
snmp_ver = row[‘snmp_version’]
snmp_target = row[‘snmp_target’]
snmp_target = snmp_target + ‘/32’
snmp_com = row[‘snmp_community’]
snmp_manag = row[‘snmp_managed’]
site_name = row[‘site_name’].decode(‘utf-8’)
entity_id = row[‘entity_id’]

Скрипт здесь

Работа с netdot через API

Есть такой замечательный инструмент для документирования сети – netdot. Он позволяет вести инвентаризацию оборудования, IPAM, с помощью snmp собирает много полезной инфы – vlan,ы, адресация, маки.. Имеет много плюсов и минусов. Здесь я хочу написать про API. Netdot имеет restfull интерфейс, для python есть соответствующая библиотека – pynetdot. Появилась задача по массовому добавлению устройств в нетдот, а именно ИБП. У нетдота есть discovery, но у нас нет одного диапазона адресов для ИБП, для них выделяются мелкие сети и они разнесены/размазаны по всему диапазону адресов. Итак, начнём.

Подключиться к серверу:

pynetdot.setup(
    url='http://127.0.0.1/netdot',
    username='admin',
    password='pass')

Для привязки ИБП-шника к объекту (Site в терминологии нетдота) необходимо найти id нужного сайта:

site = pynetdot.Site.get_first(name="Суздальский 150")
site_id = site.id

 

Для опроса устройства по snmp ему нужно задать параметр snmp_target, проще говоря ip-адрес. Адрес уже может быть в нетдоте, например в статусе discovery или static, тогда нужно просто взять его id:

ip = pynetdot.Ipblock.get_first(address='192.168.10.1')
ip_id = ip.id

Если его нет по каким-то причинам, придётся создать вручную:

newip = pynetdot.Ipblock(name = ‘suzd150-eaton’)
newip.address = ‘192.168.10.1’ #  need to be in x.x.x.x/32 format
newip.description = ‘suzd150-ups-eaton’
newip.save()
ip_id = newip.id

Что бы не было дублей, можно поискать устройство (Device) с таким ip-адресом:

pynetdot.Device.get_first(snmp_target=ip_id)

Для поиска можно использовать два метода: search или get_first. Search возвращает список (массив) из найденных “объектов”, а  get_first первое совпадение. Причем в качестве snmp_target здесь уже задаём не адрес, а его id (ссылка в mysql-базе нетдота).

Далее необходимо создать dns-запись (имя устройства):

rname = pynetdot.RR(name = ‘suzd150-eaton’)
rname.name = ‘suzd150-eaton’
rname.zone = 9 # zone == ups (suzd150-eaton.ups)
rname.save()

И создаём устройство (экземпляр класса):
device = pynetdot.Device(name=”suzd150-eaton”)

Добавляем snmp-штуки:

device.snmp_managed = 1
device.community = “ololo”
device.snmp_version = “2”
device.snmp_bulk = 1
device.snmp_polling = 1
device.canautoupdate = 1

Добавляем устройству имя, snmp_target, entite(владелец), site:

device.name = rname.id
device.snmp_target = ip_id
device.owner = entity_id
device.site = site_id
device.save() #  At first saved with name: 3386.defaultdomain
device.name = rname.id
device.save() #  All right now

В следующем посте напишу скрипт для добавления этих ИБП.