Zabbix docker + escalation


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:

vi /etc/portage/package.use/zabbix
net-analyzer/zabbix agent curl -frontend ipv6 -java ldap libxml2 mysql odbc openipmi -oracle postgres -proxy -server snmp sqlite ssh ssl -static xmpp
emerge -av net-analyzer/zabbix

Realizamos la configuarción base:

vi /etc/zabbix/zabbix_agentd.conf
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:

/etc/init.d/zabbix-agentd start
rc-update add zabbix-agentd default

Podemos ver si arranca con éxito revisando los logs:

tail -f /var/log/zabbix/zabbix_agentd.log 

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:

docker run --name zabbix-appliance -t \
      -p 10051:10051 \
      -p 8080:80 \
      -d zabbix/zabbix-appliance:latest

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:

docker exec -it zabbix-appliance /bin/bash
grep AlertScriptsPath /etc/zabbix/zabbix_server.conf |grep -v '#'
AlertScriptsPath=/usr/lib/zabbix/alertscripts

Creamos el script de llamada:

vi /usr/lib/zabbix/alertscripts/phonecall.sh
#! /bin/bash
curl -X POST http://PBXSERVER:PORT/alertSysAdminsFromZabbix --data "$1"
chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts/*
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:

docker exec -it zabbix-appliance /bin/bash

Instalamos git y clonamos el repositorio de los scripts de alerta:

apk add git
git clone https://github.com/ableev/Zabbix-in-Telegram.git
cd Zabbix-in-Telegram

Instalamos pip y los requisitos de los scripts:

apk add py2-pip
pip install -r requirements.txt

Copiamos los scripts al AlertScriptsPath:

cp zbxtg.py /usr/lib/zabbix/alertscripts/
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:

chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts/*
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:

vi /usr/lib/zabbix/alertscripts/zbxtg_settings.py
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:

docker exec -it zabbix-appliance /bin/bash
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:

./phonecall.sh TLFN

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:

/etc/init.d/zabbix-agentd stop

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
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:

docker exec -it zabbix-appliance /bin/bash

Comentamos todos los sitios donde se llame a update_zbx_config.

vi /usr/bin/docker-entrypoint.sh

Modificamos la configuración de zabbix server:

vi /etc/zabbix/zabbix_server.conf
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 stop zabbix-appliance
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:

docker exec -it zabbix-appliance /bin/bash
ls -al /var/tmp/zbxtg/

Podemos enviar Telegrams con gráficos de forma manual mediante:

su zabbix -l -s /bin/bash
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

Si te ha gustado el artículo puedes invitarme a un redbull aquí.
Autor: kr0m -- 15/02/2020 23:01:30