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.