Una de las funcionalidades mas interesantes que nos ofrece Zabbix es el escalado de alertas, mediante este sistema seremos capaces de ejecutar acciones de forma secuencial, en mi caso habrán dos horarios, horario laboral y fuera de él.
Dentro de horario el primer aviso será enviar un Telegram a los sysadmins para posteriormente realizar una llamada teléfonica, en cambio si estamos fuera de horario enviará el Telegram, llamará al sysadmin que esté de guardia y si a la tercera llamada no se ha solventado el problema o se ha puesto un ACK llamará a todos los sysadmins.
Empezamos compilando el cliente de Zabbix en nuestro cliente de pruebas:
net-analyzer/zabbix agent curl -frontend ipv6 -java ldap libxml2 mysql odbc openipmi -oracle postgres -proxy -server snmp sqlite ssh ssl -static xmpp
Realizamos la configuarción base:
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=128
Server=ZBXSERVER
ServerActive=ZBXSERVER
Hostname=Zabbix server
Arrancamos el servicio y lo metemos en el runlevel default:
rc-update add zabbix-agentd default
Podemos ver si arranca con éxito revisando los logs:
Ahora procedemos con el servidor, vamos a utilizar Docker ya que es una manera rápida de tenerlo funcionando sin complicaciones.
Creamos el contenedor de Docker, cambiamos el puerto al 8080 ya que en mi caso el 80 está siendo utilizado por otro contenedor:
Accedemos a la interfaz web y cambiamos el password por defecto del usuario Admin:
http://ZBXSERVER:8080
Admin
zabbix
Navegamos por los menús de la interfaz hasta:
Administration -> Users
Admin -> Password -> Change password
Para poder enviar notificaciones vÃa Telegram utilizaremos los scripts de ableev:
https://github.com/ableev/Zabbix-in-Telegram/
Creamos el bot necesario para enviar Telegrams:
https://core.telegram.org/bots#creating-a-new-bot
Buscamos BotFather en Telegram y creamos el bot:
/newbot
En botfather habrá salido:
Done! Congratulations on your new bot. You will find it at t.me/zbx4bot.
Use this token to access the HTTP API:
XXXXXXXXX:YYYYYYYYYYYYYYYYY
Empezamos a hablar con él:
/start
Si queremos utilizar un grupo lo creamos, añadimos el bot y dentro de él:
/start@NOMBREBOT
Añadimos un media type.
Administration -> Media types
Create Media type
Name: Telegram
Type: Script
Script name: zbxtg.py
Script parameters
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
Y otro para el envÃo de notificaciones a grupos:
Create Media type
Name: TelegramGroup
Type: Script
Script name: zbxtg.py
Script parameters
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
--group
Añadimos el media type para las llamadas.
Create Media type
Name: Phonecall
Type: Script
Script name: phonecall.sh
Averiguamos el path donde Zabbix buscará los scripts de notificación de alarmas:
AlertScriptsPath=/usr/lib/zabbix/alertscripts
Creamos el script de llamada:
#! /bin/bash
curl -X POST http://PBXSERVER:PORT/alertSysAdminsFromZabbix --data "$1"
chmod 700 /usr/lib/zabbix/alertscripts/*
Creamos un usuario por cada sysadmin con los media types que hemos definido:
Administration -> Users
Create user
Alias: kr0m
Name: kr0m
Groups: Zabbix administrators
En Media definimos el teléfono de ese sysadmin:
Send to: TLFN
También definimos el nombre de usuario de Telegram de ese sysadmin:
Send to: @USUARIO
Los medias para este sysadmin quedarán del siguiente modo:
Los usuarios deben ser de tipo Zabbix Super Admin:
NOTA: Debemos definir un media type para el usuario Admin aunque no vayamos a utilizarlo para nada en caso contrario obtendremos el siguiente error al intentar notificar alertas:
No media defined for user.
Le definimos un media type email por ejemplo y un email inventado pero lo deshabilitamos, el error seguirá saliendo pero las notificaciones funcionarán.
Por defecto ya existe un grupo de administradores(Zabbix administrators), creamos otro para el sysadmin que esté de guardia.
Administration -> User groups
Create user group
Group name: sysadminsGuardia
Instalamos los scripts necesarios para las notificaciones vÃa Telegram:
Instalamos git y clonamos el repositorio de los scripts de alerta:
Instalamos pip y los requisitos de los scripts:
pip install -r requirements.txt
Copiamos los scripts al AlertScriptsPath:
cp zbxtg_group.py /usr/lib/zabbix/alertscripts/
cp zbxtg_settings.example.py /usr/lib/zabbix/alertscripts/zbxtg_settings.py
Cambiamos el propietario y ajustamos los permisos:
chmod 700 /usr/lib/zabbix/alertscripts/*
Configuramos los parámetros del script con los datos del bot y el usuario que hemos creado en Zabbix para que el script pueda obtener las imágenes de las alertas vÃa API:
tg_key = "XXXXXXX:YYYYYYYYYYYYYYY" # telegram bot api key
zbx_server = "http://127.0.0.1" # zabbix server full url
zbx_api_user = "zbxtg"
zbx_api_pass = "zbxtgPASSWORD"
NOTA: Si queremos gráficos tendrÃamos que utilizar un usuario de zabbix de RO y configurarlo en zbxtg_settings.py
zbx_api_user
zbx_api_pass
Primero creamos el grupo de RO:
Administration -> User groups
Create user group
Group name: zbxtgRO
En Permissions: Linux servers Read
Administration -> Users
Create user
Alias: zbxtg
Groups: zbxtgRO
Al guardar si volvemos a entrar en la pestaña Permissions veremos:
Las notificaciones se ejecutarán en el orden cronológico:
- Alarma zabbix
- 6m Alarma Telegram sysadmins o sysadmin guardia según horario
- 12m - cada 6m Llamada sysadmins o sysadmin guardia según horario
- 30m Llamada a todos los sysadmins
Para que las notificaciones funcionen tendremos que editar la acción: Report problems to Zabbix administrators.
Configuration -> Actions
Event source: Triggers
Report problems to Zabbix administrators
Definimos el horario laboral:
Conditions:
Type of calculation: And/Or
Time period in 1-4,08:00-14:00
Time period in 1-4,15:00-18:00
Time period in 5,08:00-15:00
Enabled: True
Editamos las operations asociadas con la action, como la API de llamadas tiene un lÃmite de una llamada cada 5m ajustamos la duración de los steps a 6m para no superar el lÃmite.
Default operation step duration: 6m
Default subject: {TRIGGER.STATUS}: {TRIGGER.NAME} on {HOSTNAME}
Si queremos gráficos:
Default message:
Last value: {ITEM.LASTVALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
En la subsección Operations editamos la por defecto:
Steps: 2 - 2
Step duration: 0
Operation type: Send message
Send to User groups: Zabbix administrators
Send only to: Telegram
Definimos una segunda operación:
Steps: 3 - 0
Step duration: 0
Operation type: Send message
Send to User groups: Zabbix administrators
Send only to: Phonecall
Operation condition: Event acknowloedged equals Not Ack
Finalmente quedará del siguiente modo:
Creamos una nueva Action para las guardias:
Configuration -> Actions
Event source: Triggers
Definimos el horario no laboral:
Create action
Name: Guardias
Type of calculation: And/Or
Time period in 1-4,00:00-08:00
Time period in 1-4,18:00-24:00
Time period in 5,15:00-24:00
Time period in 6-7,00:00-24:00
En operations cambiamos el step duration:
Default operation step duration: 6m
Default subject: {TRIGGER.STATUS}: {TRIGGER.NAME} on {HOSTNAME}
Añadimos una operation:
Steps: 2 - 2
Step duration: 0
Operation type: Send message
Send to User groups: sysadminsGuardia
Send only to: Telegram
Después del Telegram llamaremos al sysadmin de guardia:
Steps: 3 - 5
Step duration: 0
Operation type: Send message
Send to User groups: sysadminsGuardia
Send only to: Phonecall
Operation condition: Event acknowloedged equals Not Ack
Finalmente llamaremos a todos los sysadmins:
Steps: 6 - 0
Step duration: 0
Operation type: Send message
Send to User groups: Zabbix administrators
Send only to: Phonecall
Operation condition: Event acknowloedged equals Not Ack
Finalmente quedará del siguiente modo:
Asignamos un recovery operation en las dos actions.
Recovery operations:
Default subject: {TRIGGER.STATUS}: {TRIGGER.NAME} on {HOSTNAME}
Podemos comprobar manualmente el envÃo de Telegrams:
cd /usr/lib/zabbix/alertscripts/
./zbxtg.py "@IDUSUARIO" "first part of a message" "second part of a message" --debug
También comprobamos que podamos hacer llamadas a través de nuestra API:
O desde la interfaz web de zabbix:
Administration -> Media types -> Test
Damos de alta nuestro server de pruebas.
Configuration -> Hosts
Create Host
Le asignamos el template OS Linux:
Template OS Linux by Zabbix agent
Configuramos que la perdida de comunicación con el zabbix agent sea una alarma de tipo disaster.
Configuration -> Hosts
Triggers -> Zabbix agent is not available
Severity: Disaster
Comprobamos que funcione parando el cliente:
Las notificaciones vÃa Telegram aparecerán del siguiente modo:
DEBUG:
Testeo de los scripts de Telegram:
https://github.com/ableev/Zabbix-in-Telegram/wiki/How-to-test-script-in-command-line
Podemos ver un log de las acciones tomadas por Zabbix en:
Administration -> Action log
Si queremos ver los logs del CT:
docker logs zabbix-appliance --follow
Si queremos debugear mas a fondo hay que retocar la configuración de zabbix server, para ello debemos modificar temporalmente el entrypoint de Docker para que no nos machaque nuestros cambios:
Comentamos todos los sitios donde se llame a update_zbx_config.
Modificamos la configuración de zabbix server:
DebugLevel=5
Si queremos debugear el envÃo de Telegrams en el media type de Telegram habrá que añadir el parámetro --debug:
Reiniciamos el contenedor y comprobamos que podamos ver los logs:
docker start zabbix-appliance
docker logs zabbix-appliance --follow
Los gráficos obtenidos se almacenarán en /var/tmp/zbxtg/ mientras tengamos el parámetro --debug habilitado:
ls -al /var/tmp/zbxtg/
Podemos enviar Telegrams con gráficos de forma manual mediante:
cd /usr/lib/zabbix/alertscripts/
./zbxtg.py @IDUSUARIOTELEGRAM test "$(echo -e ‘zbxtg;graphs: \nzbxtg;graphs_period=3600\nzbxtg;itemid:30471\nzbxtg;title:ololo’)" --debug
NOTA: El itemid lo sacamos viendo los logs anteriores, docker logs zabbix-appliance --follow
Cuando terminemos de debugear habrá que descomentar las llamadas a update_zbx_config en el script de entrypoint.
Algunos enlaces interesantes pueden ser:
https://github.com/ableev/Zabbix-in-Telegram/wiki/Working-with-Zabbix-3.0
https://github.com/ableev/Zabbix-in-Telegram/wiki/Emoji-in-messages
https://github.com/ableev/Zabbix-in-Telegram/wiki/Graphs