Eliminar o Desactivar Hosts vía API desde un Template

From Zabbix-ES
Jump to navigation Jump to search
Nota: La problemática es que tenemos un servicio de Openshift que crea y registra hosts en Zabbix para su monitorizacion de forma automática según necesidades de consumo. 
Pero de la misma forma que los crea y se registran tendremos que eliminarlos cuando ya no sean necesarios. Para esto crearemos un Template en Zabbix el cual aplicaremos a los hosts que tendrán este comportamiento y una vez dejen de estar activos ellos mismos dispararan un trigger que los eliminara automáticamente mediante una acción predefinida para ello.
Mas información en Github
En la siguiente imagen podemos ver como automáticamente la infraestructura creció a 7 hosts y luego de la misma forma decreció a 3. Los que están parados se tienen que eliminar automáticamente.
2020-03-31 14-51-33.png
- Creamos una Acción que se disparara cuando un trigger con el nombre "AWS Remove host" sea disparado. Este ejecutara un comando y vía API podrá eliminar o desactivar el HOST
2020-04-01 8-33-47.png
2020-04-01 8-34-00.png
2020-04-01 8-34-58.png
- Crearemos un Template que contendrá un item y un trigger que se disparara cuando el Host no pueda conectar con el Zabbix Server en X intentos.
2020-04-01 8-36-23.png
2020-04-01 8-36-40.png
2020-04-01 8-37-04.png
Nota: La condicion del trigger en la imagen fue para realizar pruebas, lo que hay que incluir es una con nodata como la siguiente: {Template Remove inactive host:net.tcp.service[tcp,"x.x.x.x",10051].nodata(1h)}=1


- Creamos un script que se conectara con el Zabbix Server y eliminara o desacrivara el Hosts indicado.
# cat <<EOF >/usr/lib/zabbix/externalscripts/zbxapi.sh 
#!/bin/bash 

#########################################################################
export zabbixServer='xxx.xxx.xxx.xxx'
export zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"

export zabbixUsername='xxxxxx'
export zabbixPassword='xxxxxx'

header='Content-Type:application/json'

# Comandos
export CURL=/usr/bin/curl
export JQ=/usr/bin/jq
export ZBX_TOKEN=""
#########################################################################


# get Token
zbx_gettoken() {
   ZBX_TOKEN=$(${CURL} -s -X POST -H "${header}" -d '{"jsonrpc": "2.0", "method":"user.login", "params":{"user":"'${zabbixUsername}'", "password":"'${zabbixPassword}'"},"auth": null,"id":0}' ${zabbixApiUrl} | ${JQ} -r ".result")
   echo $ZBX_TOKEN
}

# get HostID
zbx_getHostID() {
   if [ $# = 0 ]; then
        echo "ERROR: Parametro incorrecto. Se espera el HostID"
        exit 1
   fi
   ZBX_HOSTNAME="${1}"
   ZBX_HOSTID=$(${CURL} -s -X POST -H "${header}" -d '{"jsonrpc": "2.0", "method": "host.get", "params": { "filter": { "host": [ "'${ZBX_HOSTNAME}'" ] } }, "auth": "'${ZBX_TOKEN}'", "id": 1 }' $zabbixApiUrl | ${JQ} -r ".result[].hostid")
   echo $ZBX_HOSTID
}

# disableHostByName
zbx_disableHostByName() {
   if [ $# = 0 ]; then
        echo "ERROR: Parametro incorrecto. Se espera el Hostname"
        exit 1
   fi
   ZBX_HOSTNAME="${1}"
   ZBX_HOSTID=$(zbx_getHostID $ZBX_HOSTNAME)
   zbx_disableHostByID $ZBX_HOSTID
}

# enableHostByName
zbx_enableHostByName() {
   if [ $# = 0 ]; then
        echo "ERROR: Parametro incorrecto. Se espera el Hostname"
        exit 1
   fi
   ZBX_HOSTNAME="${1}"
   ZBX_HOSTID=$(zbx_getHostID $ZBX_HOSTNAME)
   zbx_enableHostByID $ZBX_HOSTID
}

# disableHostByID
zbx_disableHostByID() {
   if [ $# = 0 ]; then
        echo "ERROR: Parametro incorrecto. Se espera el HostID"
        exit 1
   fi
   ZBX_HOSTID="${1}"
   $CURL -s -X POST -H "${header}" -d '{"jsonrpc": "2.0", "method":"host.update", "params": {"hostid": "'${ZBX_HOSTID}'", "status": 1 }, "auth": "'${ZBX_TOKEN}'", "id": 1 }' ${zabbixApiUrl} 2>&1 >/dev/null
}

# enableHostByID
zbx_enableHostByID() {
   if [ $# = 0 ]; then
        echo "ERROR: Parametro incorrecto. Se espera el HostID"
        exit 1
   fi
   ZBX_HOSTID="${1}"
   $CURL -s -X POST -H "${header}" -d '{"jsonrpc": "2.0", "method":"host.update", "params": {"hostid": "'${ZBX_HOSTID}'", "status": 0 }, "auth": "'${ZBX_TOKEN}'", "id": 1 }' ${zabbixApiUrl} 2>&1 >/dev/null
}


# deleteHostByID
zbx_deleteHostByID() {
   if [ $# = 0 ]; then
        echo "ERROR: Parametro incorrecto. Se espera el HostID"
        exit 1
   fi
   ZBX_HOSTID="${1}"
   $CURL -s -X POST -H "${header}" -d '{"jsonrpc": "2.0", "method":"host.delete", "params": ["'${ZBX_HOSTID}'"], "auth": "'${ZBX_TOKEN}'", "id": 1 }' ${zabbixApiUrl} 2>&1 >/dev/null
}

# deleteHostByName
zbx_deleteHostByName() {
   if [ $# = 0 ]; then
        echo "ERROR: Parametro incorrecto. Se espera el Hostname"
        exit 1
   fi
   ZBX_HOSTNAME="${1}"
   ZBX_HOSTID=$(zbx_getHostID $ZBX_HOSTNAME)
   zbx_deleteHostByID $ZBX_HOSTID
}

# zbx_usage
zbx_usage() {
   echo 
   echo "Usage:"
   echo "   zbxapi.sh [deleteByName|deleteByID|enableByName|disableByName|enableByID|disableByID] HOSTNAME"
   echo 
   echo " Ejemplo desactivar host por nombre"
   echo "   # zbxapi.sh disableByName server1"
   echo 
   exit 1
}

#---------------------------------------------
# main()

ZBX_TOKEN=$(zbx_gettoken)

if [ $# -lt 1 ]; then
   zbx_usage
   exit 1
fi

cmd="${1}"
shift
case "${cmd}" in
        "deleteByName" )
                zbx_deleteHostByName ${*}
                ;;
        "deleteByID" )
                zbx_deleteHostByID ${*}
                ;;
        "enableByName" )
                zbx_enableHostByName ${*}
                ;;
        "disableByName" )
                zbx_disableHostByName ${*}
                ;;
        "enableByID" )
                zbx_enableHostByID ${*}
                ;;
        "disableByID" )
                zbx_disableHostByID ${*}
                ;;
        * )
                zbx_usage
                ;;
esac

exit 0
EOF

# chmod 755 /usr/lib/zabbix/externalscripts/zbxapi.sh