Cómo enviar alertas de Zabbix a Telegram

Zabbix es muy flexible y hace unos días que lo integre para que nos caigan las alertas en un grupo de Telegram, para que todo el equipo pueda saber qué está pasando, no solo el que está de guardia.

Hace mes y medio que estoy trabajando dentro de una empresa que da servicios a la telco más grande de Uruguay, estos servicios son de administración de plataformas, específicamente yo estoy dentro del equipo Linux y llegué justo cuando se está terminando de migrar desde Nagios a Zabbix.

Una de las cosas que había que revisar son las alertas y cómo estas nos llegan, las de email, son fáciles de configurar y ya están pero de repente, depende de cómo el usuario tenga configurada la cuenta de correo en el móvil, el email puede "llegar" más tarde que pronto y de repente podemos encontrarnos con un escenario donde nos enteramos una hora después que un servidor esta caido.

Así que me puse a buscar cómo integrarlo, de una manera más dinámica y encontré que se puede enviar las alertas de Zabbix a un chat de Telegram a través de un bot.

Parte 1: Crear el bot

Lo primero que tenemos que hacer es crear un BOT en Telegram. Para esto, abrimos la aplicación de mensajería mencionada y comenzamos una conversación con BotFather y le tiramos lo siguiente:

/newbot

Te va a responder con lo siguiente:

Alright, a new bot. How are we going to call it? Please choose a name for your bot.

El nombre que elijamos para el bot, debe terminar con la palabra bot, por ejemplo, le respondemos

cduser_bot

y ahora nos va a responder una vez más con la confirmación de que ha sido creado, el mensaje se verá algo así:

Done! Congratulations on your new bot. You will find it at t.me/cduser_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API: #########
Keep your token secure and store it safely, it can be used by anyone to control your bot.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Fijense que acá arriba edite el HTTP API, ese dato es privado y no deben compartirlo ya que cualquier podría hacer uso de nuestro BOT, dicho esto, tengan esa key a mano que la vamos a necesitar más adelante.

Lo siguiente que hice fue crear un grupo de Telegram y agregar al bot, pero lo que luego vamos a necesitar es conocer el ID de ese chat en grupo, para eso, tenemos que agregar un bot que se llama RawDataBot, cuando lo hagamos, en unos segundos, nos enviará un mensaje dentro del grupo con un contenido muy similar al siguiente.

{
    "update_id": 754*****,
    "message": {
        "message_id": 31***,
        "from": {
            "id": 9869***,
            "is_bot": false,
            "first_name": "Nacho",
            "last_name": "Van Droogenbroeck",
            "username": "nvdkuy",
            "language_code": "es"
        },
        "chat": {
            "id": -311*****,
            "title": "Alertas",
            "type": "group",
            "all_members_are_administrators": true
        },
        "date": 1570844791,
        "new_chat_participant": {
            "id": 211246197,
            "is_bot": true,
            "first_name": "Telegram Bot Raw",
            "username": "RawDataBot"
        },
        "new_chat_member": {
            "id": 211246197,
            "is_bot": true,
            "first_name": "Telegram Bot Raw",
            "username": "RawDataBot"
        },
        "new_chat_members": [
            {
                "id": 211246197,
                "is_bot": true,
                "first_name": "Telegram Bot Raw",
                "username": "RawDataBot"
            }
        ]
    }
}

Vamos a extraer una parte de la respuesta de arriba, especificamente está:

"chat": {
            "id": -311*****,
            "title": "Alertas",
            "type": "group",
            "all_members_are_administrators": true
        },

Lo que necesitamos aquí es el ID del chat. Así que con la API Key y el ID del chat, estamos listos para comenzar a tocar el Zabbix.

Parte 2: Bajar y configurar el script en el servidor

Ya tenemos creado nuestro bot, ahora lo que tenemos que hacer es bajar un script en nuestro servidor de Zabbix, normalmente la ruta donde tenemos que dirigirnos es a:

/usr/lib/zabbix

y ahí adentro buscamos la carpeta alertscripts si no está, la creamos y entramos, quedando de esta manera:

/usr/lib/zabbix/alertscripts

ahí bajamos el siguiente script que pueden encontrar dentro del repositorio Zabbix en mi Git Tea (están invitados a registrarse y crear sus repositorios, totalmente gratis)

Ignacio Van Droogenbroeck / Zabbix and Telegram Integration
GitLab.com

Si quieren hacerlo fácil, les dejo el raw para que puedan hacer un wget directamente a la carpeta:

wget https://gitlab.com/xe-nvdk/telegram-zabbix/raw/18ebcfa8bc160e5afaf3b0c913a9a118f4312c7a/telegram-notify_zabbix-telegram.sh

Una vez descargado no nos olvidemos de hacerlo ejecutable con el siguiente comando.

chmod +x telegram-notify_zabbix-telegram.sh

En este archivo, debemos modificar ciertas cosas, veamos a continuación cuales son:

La primera es indicar donde esta el servidor de Zabbix con el formato http://

#############################################
# Zabbix address
#############################################

ZBX_URL="https://ZabbixAddress"

Luego, tenemos que especificar un usuario y contraseña que va a acceder, no te recomiendo que sea el usuario Super administrador de Zabbix, solo alguno que tenga permisos de lectura. Esto se hace en la siguiente sección:

##############################################
# Zabbix credentials to login
##############################################

USERNAME="username"
PASSWORD="password"

Luego, debemos especificarle la versión de Zabbix.

#############################################
# Zabbix versione >= 3.4.1
# 0 for no e 1 for yes
#############################################

ZABBIXVERSION34="1"

Lo siguiente se pone más serio, porque debemos agregar Token ID del bot que creamos.

############################################
# Bot data from Telegram
############################################

BOT_TOKEN='TokenID'

y Por último, especificar si queremos que nos mande la alerta con el gráfico o no, para algunos puede serle útil, en mi caso los deshabilite pero depende de la necesidad de ustedes.

#############################################
# To disable graph sending set SEND_GRAPH = 0, otherwise SEND_GRAPH = 1
# To disable message content sending set SEND_MESSAGE = 0, otherwise SEND_MESSAGE = 1
#############################################

SEND_GRAPH=1
SEND_MESSAGE=1

Una vez terminado de guardar, podemos probar con el siguiente comando si el mensaje lo manda.

./telegram-notify_zabbix-telegram.sh -idchat "OK" "Message probando"

Si llega al grupo, excelente, vamos a la parte 3, que es configurar Zabbix.

Parte 3: Configurar Zabbix

Bueno, ahora lo que debemos hacer es entrar a nuestro Zabbix e ir a la parte de administración y agregar un Media Type. El tipo tiene que estar seleccionado Script como en la imágen y por supuesto, debemos poner el nombre del nuestro archivo sh.

Debería quedar algo así, los parámetros también debemos agregarlos.

Lo siguiente es configurar nuestro usuario para Zabbix, nos haga llegar las alertas. En este caso, como yo estoy dentro del grupo de Administradores Linux y soy el administrador del grupo de Telegram, con solo agregar a mi usuario en el media Telegram invocando el ID del Chat, quedando de esta manera:

Por último para que nos llegue efectivamente, debemos configurar las acciones, creamos una y en la solapa de operaciones ponemos como default subject lo siguiente:

{TRIGGER.STATUS} {TRIGGER.SEVERITY} {TRIGGER.NAME} on {HOST.NAME1}

Y en el Default Message lo siguiente:

Trigger:{TRIGGER.NAME}
Trigger status:{TRIGGER.STATUS}
Trigger severity:{TRIGGER.SEVERITY}
Trigger URL:{TRIGGER.URL}
 
Item values:
1.{ITEM.NAME1}({HOST.NAME1}:{ITEM.KEY1}):{ITEM.VALUE1}
 
Item Graphic:[{ITEM.ID1}]

Ahora bien, la acción a todo esto, en mi caso quedó así, de esta manera, lo que va a hacer es que cuando se genere una alerta la va a enviar solo por Telegram al usuario indicado, en este caso, a mi.

Si todo salió bien, cuando surja algún problema, deberíamos recibir la alerta en nuestro grupo, para mi caso particular quedo más que bien y así aparece (Estoy usando Telegram Web)

Como ven, depende de la severidad con la que configuremos el trigger, nos mostrará la señal de advertencia o un icono rojo si esta alerta es crítica. Cuando se resuelve, trae el mensaje con signo de check.

¿Qué te pareció? ¿Lo probaste? ¿Pudiste probarlo? ¿De qué otra manera probaste hacerte llegar las alertas de Zabbix u otro sistema de monitoreo?

Creditos imágen: Unplash