clonando items y triggers en Zabbix con python

por | 28 diciembre, 2019

La tarea se puede realizar desde el frontend sin embargo cuando la tarea se tiene que hacer con multiples triggers e items la tarea cambia

Para esa labor elabore una pequeña función llamada «ClonTrigger» usando la libreria pyzabbix y que permitirá que a partir de un trigger se copie tanto el item como el mismo trigger en otro host, pudiendo usar esta funcion para que sea un grupo de hosts del Zabbix o una lista independientes de hosts


def ClonTrigger(TriggerOrigen,HostDestino,Severidad=6):
 """ 
 clonar x cantidad de triggers a un nuevo host incluyendo el item del trigger
 """
 #Severidad
 #Possible values are:
 #0 - (default) not classified;
 #1 - information;
 #2 - warning;
 #3 - average;
 #4 - high;
 #5 - disaster.
 InfoTrigger=zapi.trigger.get(triggerids=TriggerOrigen,selectFunctions="extend",expandExpression=1)[0]
 InfoItem=zapi.item.get(itemids=InfoTrigger["functions"][0]["itemid"])[0]
 infoDST=zapi.hostinterface.get(hostids=HostDestino)
 if (Severidad != 6):
  InfoTrigger["priority"]=Severidad
 #se verifica que el key_ no exista con anterioridad, si existe, se omite la creacion del item y se pasa directo a la creacion del trigger
 if (len(zapi.item.get(hostids=HostDestino,search={"key_":InfoItem["key_"]})) == 1):
  print("Item ya creado, creando trigger")
 else: 
  #definimos las variables necesarias para el nuevo host empezando por la ip a usar en el item
  #de existir 1 sola ip en el host esta se usara para el item
  if len(infoDST) == 1:
   InfoItem['interfaceid']=infoDST[0]['interfaceid']
  else:
   ListIntAgent=[0,3,7,10,13,14]
   ListIntSnmp=[1,4,6,17]
   ListIntNull=[5,2,8,9,11,15]
   ListIntIpmi=[12]
   ListIntJmx=[16]
   #se convierte el valor type del item a entero para hacer match con las listas
   ItemType=int(InfoItem["type"])
   if ItemType in ListIntAgent:
    for ipid in infoDST:
     if ipid["type"] == "1" and ipid["main"] == "1":
      InfoItem['interfaceid']= ipid["interfaceid"]
   elif ItemType in ListIntSnmp:
    for ipid in infoDST:
     if ipid["type"] == "2" and ipid["main"] == "1":
      InfoItem['interfaceid']= ipid["interfaceid"]
   elif ItemType in ListIntIpmi:
    for ipid in infoDST:
     if ipid["type"] == "3" and ipid["main"] == "1":
      InfoItem['interfaceid']= ipid["interfaceid"]
   elif ItemType in ListIntJmx:
    for ipid in infoDST:
     if ipid["type"] == "4" and ipid["main"] == "1":
      InfoItem['interfaceid']= ipid["interfaceid"]
  #editamos el item eliminando los valores read-only obtenidos anteriormente
  InfoItem["hostid"]=HostDestino
  del InfoItem["itemid"]
  del InfoItem["templateid"]
  del InfoItem["flags"]
  del InfoItem["state"]
  zapi.item.create(InfoItem)
 #Para la creacion del trigger se debe editar la expression ya que orignalmente incluye la informacion del host de origen, y se debe validar si el origen es un template o un hosts
 if (len(zapi.host.get(hostids=HostDestino)) == 1):
  InfoTrigger['expression']=InfoTrigger["expression"].replace(InfoTrigger["expression"].split(":",1)[0],"{"+zapi.host.get(hostids=HostDestino)[0]["host"])
 else:
  InfoTrigger['expression']=InfoTrigger["expression"].replace(InfoTrigger["expression"].split(":",1)[0],"{"+zapi.template.get(templateids=HostDestino)[0]["host"])
 #modificamos el diccionario ya creado con la info del trigger de origen se borran los valores read-only y se cambian los valores para el destino
 InfoTrigger["hostid"]=HostDestino
 del InfoTrigger["triggerid"]
 del InfoTrigger["state"]
 del InfoTrigger["flags"]
 del InfoTrigger["lastchange"]
 del InfoTrigger["templateid"]
 del InfoTrigger["value"]
 del InfoTrigger["error"]
 zapi.trigger.create(InfoTrigger)

con eso recopilamos los datos del trigger e item de origen y los duplicamos en el destino cambiando la expresion usada en el trigger y la ip usada en el item, para esto ultimo en caso de existir mas de una interfaz en el host de destino se usara la interfaz por defecto.

Lo primero y antes de usar la función hay que invocar la librería para poder usar sus funciones eso lo hacemos con los siguientes comandos

from pyzabbix import ZabbixAPI

zapi = ZabbixAPI("<URL>")
zapi.login("<USR>", "<PASS>")
print("Connected to Zabbix API Version %s" % zapi.api_version())

Si queremos clonar un grupo de triggers podemos ir jugando con los for o crear listas personalizadas con los triggerid que deseamos clonar

Ademas incorpore una 3° opción en la función la cual nos permitirá modificar la severidad de la alarma, en caso de querer mantener la misma severidad solo debemos evitar colocar el 3° argumento

Nota importante: en el host destino ya deben estar creadas con anterioridad las ip necesarias dependiendo del tipo de item (snmp agente) el script tomara la ip que este marcada por defecto en caso de existir mas de una ip/dns y fallara en caso que no encuentre alguna ip/dns valida

Faltan muchas cosas por evolucionar de esta función como por ejemplo el manejo de los posibles errores, poder elegir la interfaz para cada item o poder crearlo en caso que no exista pero al menos de momento y para lo que yo lo necesito cumple su función.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *