Не так давно наткнулся на интересную систему мониторинга Observium, в которой заинтересовало хранение конфигов сетевых железок и еще несколько фишек которые описаны в статье.
У меня уже используются Zabbix и полностью переходить на новый мониторинг даже не хочется, так же как и добавлять новые хосты сразу в два тоже лениво, поэтому пришла в голову идея забирать хосты из забикса скриптом через API и добавлять их на Observium.
В Observium почему-то нельзя идеологически добавлять хосты по IP-адресу, поэтому перед добавлением хоста, который по каким-то причинам не резолвится DNS, его необходимо добавить в файл /etc/hosts. У меня устройства Cisco разбиты по группам (роутеры, точки доступа, коммутаторы), а имена начинаются с аббревиатуры города, например NSK Cisco 2811 — 10.20.23.1
Добавлять хосты в Observium будем в виде city-type-X-X-X-X.domain.name. Также скриптом будем забирать snmp community из макроса в хосте Zabbix.
Для начала поставим pyZabbix:
Ну а дальше, собственно, сам скрипт:
Данный скрипт забирает хосты по очереди с разных групп устройств и помещает их в файл hosts, также создаётся скрипт добавления хостов в Observium и запускается на исполнение.
У меня уже используются Zabbix и полностью переходить на новый мониторинг даже не хочется, так же как и добавлять новые хосты сразу в два тоже лениво, поэтому пришла в голову идея забирать хосты из забикса скриптом через API и добавлять их на Observium.
В Observium почему-то нельзя идеологически добавлять хосты по IP-адресу, поэтому перед добавлением хоста, который по каким-то причинам не резолвится DNS, его необходимо добавить в файл /etc/hosts. У меня устройства Cisco разбиты по группам (роутеры, точки доступа, коммутаторы), а имена начинаются с аббревиатуры города, например NSK Cisco 2811 — 10.20.23.1
Добавлять хосты в Observium будем в виде city-type-X-X-X-X.domain.name. Также скриптом будем забирать snmp community из макроса в хосте Zabbix.
Для начала поставим pyZabbix:
pip install pyzabbix
Ну а дальше, собственно, сам скрипт:
#!/usr/bin/python import os from pyzabbix import ZabbixAPI zapi = ZabbixAPI(server="http://servername/zabbix") zapi.login("login", "password") file_hosts = open('/etc/hosts', 'w') file_hosts.truncate() file_hosts.write ("##### Auto generated by script /opt/observium/scripts/get_zabbix_hosts.py" + '\n') file_script_add_device = open('/opt/observium/scripts/_my_script_add_device.sh', 'w') file_script_add_device.truncate() file_script_add_device.write ("#!/bin/bash" + '\n\n') file_script_add_device.write ("##### Auto generated by script /opt/observium/scripts/_my_script_import_from_zbx.py" + '\n') file_hosts.write ('\n' + "##### Cisco Routers" + '\n') file_script_add_device.write ('\n' + "##### Cisco Routers" + '\n') routers = zapi.host.get(output = 'extend', groupids = '11', ) if (routers != 0) and (len(routers) != 0): for h in routers: if h['status'] == '0': hid = h['hostid'] ipadr = zapi.hostinterface.get(hostids = hid ,filter={"main":["1"]})[0]['ip'] ipadr_spliter = ipadr.split(".") city = h['name'].split(" ")[0].lower() dns_name = (city + "-gw-" + ipadr_spliter[0] + "-" + ipadr_spliter[1] + "-" + ipadr_spliter[2] + "-" + ipadr_spliter[3] + ".domain.name") snmp_community = zapi.usermacro.get(output = 'extend', hostids = hid, filter={"macro":["{$SNMP_COMMUNITY}"]})[0]['value'] line_hosts = (ipadr + " " + dns_name) file_hosts.write (line_hosts + '\n') line_add_device = ("/opt/observium/add_device.php " + dns_name + " " + snmp_community + " v2c") file_script_add_device.write (line_add_device + '\n') file_hosts.write ('\n' + "##### Cisco Access Points" + '\n') file_script_add_device.write ('\n' + "##### Cisco Access Points" + '\n') access_points = zapi.host.get(output = 'extend', groupids = '20', ) if (access_points != 0) and (len(access_points) != 0): for h in access_points: if h['status'] == '0': hid = h['hostid'] ipadr = zapi.hostinterface.get(hostids = hid ,filter={"main":["1"]})[0]['ip'] ipadr_spliter = ipadr.split(".") city = h['name'].split(" ")[0].lower() dns_name = (city + "-ap-" + ipadr_spliter[0] + "-" + ipadr_spliter[1] + "-" + ipadr_spliter[2] + "-" + ipadr_spliter[3] + ".domain.name") snmp_community = zapi.usermacro.get(output = 'extend', hostids = hid, filter={"macro":["{$SNMP_COMMUNITY}"]})[0]['value'] line_hosts = (ipadr + " " + dns_name) file_hosts.write (line_hosts + '\n') line_add_device = ("/opt/observium/add_device.php " + dns_name + " " + snmp_community + " v2c") file_script_add_device.write (line_add_device + '\n') file_hosts.write ('\n' + "##### Cisco Switches" + '\n') file_script_add_device.write ('\n' + "##### Cisco Switches" + '\n') switches = zapi.host.get(output = 'extend', groupids = '19', ) if (switches != 0) and (len(switches) != 0): for h in switches: if h['status'] == '0': hid = h['hostid'] ipadr = zapi.hostinterface.get(hostids = hid ,filter={"main":["1"]})[0]['ip'] ipadr_spliter = ipadr.split(".") city = h['name'].split(" ")[0].lower() dns_name = (city + "-sw-" + ipadr_spliter[0] + "-" + ipadr_spliter[1] + "-" + ipadr_spliter[2] + "-" + ipadr_spliter[3] + ".domain.name") snmp_community = zapi.usermacro.get(output = 'extend', hostids = hid, filter={"macro":["{$SNMP_COMMUNITY}"]})[0]['value'] line_hosts = (ipadr + " " + dns_name) file_hosts.write (line_hosts + '\n') line_add_device = ("/opt/observium/add_device.php " + dns_name + " " + snmp_community + " v2c") file_script_add_device.write (line_add_device + '\n') file_hosts.close() file_script_add_device.close() os.system("chmod 750 /opt/observium/scripts/_my_script_add_device.sh") os.system("/opt/observium/scripts/_my_script_add_device.sh | grep 'Could not reach ' > /var/log/import_hosts_from_zabbix.log")
Данный скрипт забирает хосты по очереди с разных групп устройств и помещает их в файл hosts, также создаётся скрипт добавления хостов в Observium и запускается на исполнение.
