mirror of
https://github.com/TheNetworkGuy/netbox-zabbix-sync.git
synced 2025-07-14 01:41:25 -06:00
parent
e8a733cbd0
commit
23997f9423
@ -72,7 +72,7 @@ class NetworkDevice():
|
|||||||
if device_cf in self.nb.custom_fields:
|
if device_cf in self.nb.custom_fields:
|
||||||
self.zabbix_id = self.nb.custom_fields[device_cf]
|
self.zabbix_id = self.nb.custom_fields[device_cf]
|
||||||
else:
|
else:
|
||||||
e = f"Custom field {device_cf} not found for {self.name}."
|
e = f"Device {self.name}: Custom field {device_cf} not present"
|
||||||
self.logger.warning(e)
|
self.logger.warning(e)
|
||||||
raise SyncInventoryError(e)
|
raise SyncInventoryError(e)
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ class NetworkDevice():
|
|||||||
"""
|
"""
|
||||||
# Check if there are templates defined
|
# Check if there are templates defined
|
||||||
if not self.zbx_template_names:
|
if not self.zbx_template_names:
|
||||||
e = f"No templates found for device {self.name}"
|
e = f"Device {self.name}: No templates found"
|
||||||
self.logger.info(e)
|
self.logger.info(e)
|
||||||
raise SyncInventoryError()
|
raise SyncInventoryError()
|
||||||
# Set variable to empty list
|
# Set variable to empty list
|
||||||
@ -290,8 +290,7 @@ class NetworkDevice():
|
|||||||
template_match = True
|
template_match = True
|
||||||
self.zbx_templates.append({"templateid": zbx_template['templateid'],
|
self.zbx_templates.append({"templateid": zbx_template['templateid'],
|
||||||
"name": zbx_template['name']})
|
"name": zbx_template['name']})
|
||||||
e = (f"Found template {zbx_template['name']}"
|
e = f"Device {self.name}: found template {zbx_template['name']}"
|
||||||
f" for host {self.name}.")
|
|
||||||
self.logger.debug(e)
|
self.logger.debug(e)
|
||||||
# Return error should the template not be found in Zabbix
|
# Return error should the template not be found in Zabbix
|
||||||
if not template_match:
|
if not template_match:
|
||||||
@ -310,7 +309,7 @@ class NetworkDevice():
|
|||||||
for group in groups:
|
for group in groups:
|
||||||
if group['name'] == self.hostgroup:
|
if group['name'] == self.hostgroup:
|
||||||
self.group_id = group['groupid']
|
self.group_id = group['groupid']
|
||||||
e = f"Found group {group['name']} for host {self.name}."
|
e = f"Device {self.name}: matched group {group['name']}"
|
||||||
self.logger.debug(e)
|
self.logger.debug(e)
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
@ -325,7 +324,7 @@ class NetworkDevice():
|
|||||||
self.zabbix.host.delete(self.zabbix_id)
|
self.zabbix.host.delete(self.zabbix_id)
|
||||||
self.nb.custom_fields[device_cf] = None
|
self.nb.custom_fields[device_cf] = None
|
||||||
self.nb.save()
|
self.nb.save()
|
||||||
e = f"Deleted host {self.name} from Zabbix."
|
e = f"Device {self.name}: Deleted host from Zabbix."
|
||||||
self.logger.info(e)
|
self.logger.info(e)
|
||||||
self.create_journal_entry("warning", "Deleted host from Zabbix")
|
self.create_journal_entry("warning", "Deleted host from Zabbix")
|
||||||
except APIRequestError as e:
|
except APIRequestError as e:
|
||||||
@ -395,11 +394,11 @@ class NetworkDevice():
|
|||||||
continue
|
continue
|
||||||
# If the proxy name matches
|
# If the proxy name matches
|
||||||
if proxy["name"] == proxy_name:
|
if proxy["name"] == proxy_name:
|
||||||
|
self.logger.debug(f"Device {self.name}: using {proxy['type']}"
|
||||||
|
f" {proxy_name}")
|
||||||
self.zbxproxy = proxy
|
self.zbxproxy = proxy
|
||||||
return True
|
return True
|
||||||
else:
|
|
||||||
self.logger.warning(f"Device {self.name}: unable to find proxy {proxy_name}")
|
self.logger.warning(f"Device {self.name}: unable to find proxy {proxy_name}")
|
||||||
break
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def createInZabbix(self, groups, templates, proxies,
|
def createInZabbix(self, groups, templates, proxies,
|
||||||
@ -450,17 +449,17 @@ class NetworkDevice():
|
|||||||
host = self.zabbix.host.create(**create_data)
|
host = self.zabbix.host.create(**create_data)
|
||||||
self.zabbix_id = host["hostids"][0]
|
self.zabbix_id = host["hostids"][0]
|
||||||
except APIRequestError as e:
|
except APIRequestError as e:
|
||||||
e = f"Couldn't add {self.name}, Zabbix returned {str(e)}."
|
e = f"Device {self.name}: Couldn't create. Zabbix returned {str(e)}."
|
||||||
self.logger.error(e)
|
self.logger.error(e)
|
||||||
raise SyncExternalError(e) from e
|
raise SyncExternalError(e) from None
|
||||||
# Set Netbox custom field to hostID value.
|
# Set Netbox custom field to hostID value.
|
||||||
self.nb.custom_fields[device_cf] = int(self.zabbix_id)
|
self.nb.custom_fields[device_cf] = int(self.zabbix_id)
|
||||||
self.nb.save()
|
self.nb.save()
|
||||||
msg = f"Created host {self.name} in Zabbix."
|
msg = f"Device {self.name}: Created host in Zabbix."
|
||||||
self.logger.info(msg)
|
self.logger.info(msg)
|
||||||
self.create_journal_entry("success", msg)
|
self.create_journal_entry("success", msg)
|
||||||
else:
|
else:
|
||||||
e = f"Unable to add {self.name} to Zabbix: host already present."
|
e = f"Device {self.name}: Unable to add to Zabbix. Host already present."
|
||||||
self.logger.warning(e)
|
self.logger.warning(e)
|
||||||
|
|
||||||
def createZabbixHostgroup(self):
|
def createZabbixHostgroup(self):
|
||||||
@ -474,7 +473,7 @@ class NetworkDevice():
|
|||||||
data = {'groupid': groupid["groupids"][0], 'name': self.hostgroup}
|
data = {'groupid': groupid["groupids"][0], 'name': self.hostgroup}
|
||||||
return data
|
return data
|
||||||
except APIRequestError as e:
|
except APIRequestError as e:
|
||||||
e = f"Couldn't add hostgroup, Zabbix returned {str(e)}."
|
e = f"Couldn't add hostgroup {self.hostgroup}, Zabbix returned {str(e)}."
|
||||||
self.logger.error(e)
|
self.logger.error(e)
|
||||||
raise SyncExternalError(e) from e
|
raise SyncExternalError(e) from e
|
||||||
|
|
||||||
@ -486,7 +485,8 @@ class NetworkDevice():
|
|||||||
try:
|
try:
|
||||||
self.zabbix.host.update(hostid=self.zabbix_id, **kwargs)
|
self.zabbix.host.update(hostid=self.zabbix_id, **kwargs)
|
||||||
except APIRequestError as e:
|
except APIRequestError as e:
|
||||||
e = f"Zabbix returned the following error: {str(e)}."
|
e = (f"Device {self.name}: Unable to update. "
|
||||||
|
f"Zabbix returned the following error: {str(e)}.")
|
||||||
self.logger.error(e)
|
self.logger.error(e)
|
||||||
raise SyncExternalError(e) from None
|
raise SyncExternalError(e) from None
|
||||||
self.logger.info(f"Updated host {self.name} with data {kwargs}.")
|
self.logger.info(f"Updated host {self.name} with data {kwargs}.")
|
||||||
@ -524,7 +524,7 @@ class NetworkDevice():
|
|||||||
self.logger.error(e)
|
self.logger.error(e)
|
||||||
raise SyncInventoryError(e)
|
raise SyncInventoryError(e)
|
||||||
if len(host) == 0:
|
if len(host) == 0:
|
||||||
e = (f"No Zabbix host found for {self.name}. "
|
e = (f"Device {self.name}: No Zabbix host found. "
|
||||||
f"This is likely the result of a deleted Zabbix host "
|
f"This is likely the result of a deleted Zabbix host "
|
||||||
f"without zeroing the ID field in Netbox.")
|
f"without zeroing the ID field in Netbox.")
|
||||||
self.logger.error(e)
|
self.logger.error(e)
|
||||||
@ -680,7 +680,7 @@ class NetworkDevice():
|
|||||||
try:
|
try:
|
||||||
# API call to Zabbix
|
# API call to Zabbix
|
||||||
self.zabbix.hostinterface.update(updates)
|
self.zabbix.hostinterface.update(updates)
|
||||||
e = f"Solved {self.name} interface conflict."
|
e = f"Device {self.name}: solved interface conflict."
|
||||||
self.logger.info(e)
|
self.logger.info(e)
|
||||||
self.create_journal_entry("info", e)
|
self.create_journal_entry("info", e)
|
||||||
except APIRequestError as e:
|
except APIRequestError as e:
|
||||||
@ -715,7 +715,7 @@ class NetworkDevice():
|
|||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
self.nb_journals.create(journal)
|
self.nb_journals.create(journal)
|
||||||
self.logger.debug(f"Created journal entry in NB for host {self.name}")
|
self.logger.debug(f"Device {self.name}: Created journal entry in Netbox")
|
||||||
return True
|
return True
|
||||||
except JournalError(e) as e:
|
except JournalError(e) as e:
|
||||||
self.logger.warning("Unable to create journal entry for "
|
self.logger.warning("Unable to create journal entry for "
|
||||||
|
@ -13,12 +13,30 @@ class ZabbixInterface():
|
|||||||
self.skelet = {"main": "1", "useip": "1", "dns": "", "ip": self.ip}
|
self.skelet = {"main": "1", "useip": "1", "dns": "", "ip": self.ip}
|
||||||
self.interface = self.skelet
|
self.interface = self.skelet
|
||||||
|
|
||||||
|
def _set_default_port(self):
|
||||||
|
"""Sets default TCP / UDP port for different interface types"""
|
||||||
|
interface_mapping = {
|
||||||
|
1: 10050,
|
||||||
|
2: 161,
|
||||||
|
3: 623,
|
||||||
|
4: 12345
|
||||||
|
}
|
||||||
|
# Check if interface type is listed in mapper.
|
||||||
|
if self.interface['type'] not in interface_mapping:
|
||||||
|
return False
|
||||||
|
# Set default port to interface
|
||||||
|
self.interface["port"] = str(interface_mapping[self.interface['type']])
|
||||||
|
return True
|
||||||
|
|
||||||
def get_context(self):
|
def get_context(self):
|
||||||
""" check if Netbox custom context has been defined. """
|
""" check if Netbox custom context has been defined. """
|
||||||
if "zabbix" in self.context:
|
if "zabbix" in self.context:
|
||||||
zabbix = self.context["zabbix"]
|
zabbix = self.context["zabbix"]
|
||||||
if("interface_type" in zabbix and "interface_port" in zabbix):
|
if "interface_type" in zabbix:
|
||||||
self.interface["type"] = zabbix["interface_type"]
|
self.interface["type"] = zabbix["interface_type"]
|
||||||
|
if not "interface_port" in zabbix:
|
||||||
|
self._set_default_port()
|
||||||
|
return True
|
||||||
self.interface["port"] = zabbix["interface_port"]
|
self.interface["port"] = zabbix["interface_port"]
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
@ -140,13 +140,13 @@ def main(arguments):
|
|||||||
if device.isCluster() and clustering:
|
if device.isCluster() and clustering:
|
||||||
# Check if device is primary or secondary
|
# Check if device is primary or secondary
|
||||||
if device.promoteMasterDevice():
|
if device.promoteMasterDevice():
|
||||||
e = (f"Device {device.name} is "
|
e = (f"Device {device.name}: is "
|
||||||
f"part of cluster and primary.")
|
f"part of cluster and primary.")
|
||||||
logger.info(e)
|
logger.info(e)
|
||||||
else:
|
else:
|
||||||
# Device is secondary in cluster.
|
# Device is secondary in cluster.
|
||||||
# Don't continue with this device.
|
# Don't continue with this device.
|
||||||
e = (f"Device {device.name} is part of cluster "
|
e = (f"Device {device.name}: is part of cluster "
|
||||||
f"but not primary. Skipping this host...")
|
f"but not primary. Skipping this host...")
|
||||||
logger.info(e)
|
logger.info(e)
|
||||||
continue
|
continue
|
||||||
@ -156,11 +156,11 @@ def main(arguments):
|
|||||||
# Delete device from Zabbix
|
# Delete device from Zabbix
|
||||||
# and remove hostID from Netbox.
|
# and remove hostID from Netbox.
|
||||||
device.cleanup()
|
device.cleanup()
|
||||||
logger.info(f"Cleaned up host {device.name}.")
|
logger.info(f"Device {device.name}: cleanup complete")
|
||||||
continue
|
continue
|
||||||
# Device has been added to Netbox
|
# Device has been added to Netbox
|
||||||
# but is not in Activate state
|
# but is not in Activate state
|
||||||
logger.info(f"Skipping host {device.name} since its "
|
logger.info(f"Device {device.name}: skipping since this device is "
|
||||||
f"not in the active state.")
|
f"not in the active state.")
|
||||||
continue
|
continue
|
||||||
# Check if the device is in the disabled state
|
# Check if the device is in the disabled state
|
||||||
|
Loading…
Reference in New Issue
Block a user