- PVSM.RU - https://www.pvsm.ru -

Как подружить Zabbix и Observium

Не так давно наткнулся на интересную систему мониторинга Observium, в которой заинтересовало хранение конфигов сетевых железок и еще несколько фишек которые описаны в статье [1].

У меня уже используются 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" + 'nn')
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, также создаётся скрипт добавления хостов в Obversion и запускается на исполнение.

Автор: MukhTonio

Источник [2]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/zabbix/184904

Ссылки в тексте:

[1] статье: https://habrahabr.ru/post/249549/

[2] Источник: https://habrahabr.ru/post/309532/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox