Templates de Zabbix

Continuando con nuestra instalación de Zabbix vamos a configurar algunos templates para tener más controlada nuestra infraestructura. Veremos cómo añadir gráficos sobre Nginx, MySQL y PostgreSQL. Con los dos primero tendremos una visual de lo que le sucede a nuestro blog y con el tercero controlaremos el acceso a base de datos de nuestra querida RaspberryPi 2.

Manos a la obra. Para nuestro primer template utilizaremos este proyecto. La configuración es muy simple, también es verdad que no conseguiremos unos gráficos impresionantes pero veremos cómo se mueven los accesos a nuestro sitio web.

Lo primero que debemos hacer es activar el módulo de estadísticas en nuestro servidor Nginx, para ello añadiremos el siguiente trozo de código en la configuración del servicio, /etc/nginx/nginx.conf:

[...]
location /nginx_stat {
                stub_status     on;
                access_log      off;
                allow           192.168.x.0/24;
                deny            all;
        }
[...]

Como habéis observado hemos añadido una localización nueva en la que activamos el módulo stub_status a la que permitimos el acceso desde nuestra red interna y denegamos al resto. También es interesante comentar que con esta configuración sacamos los accesos a esta parte del servidor de los logs de Nginx. Reiniciamos el servidor y haremos una prueba desde esta red para comprobar cómo aparecen las estadísticas.

# service nginx restart

Aquí os dejo un ejemplo de salida:

Active connections: 2
server accepts handled requests
 42581 42581 42674
Reading: 0 Writing: 1 Waiting: 1

Como véis la información no es muy extensa pero nos sirve para hacernos una idea de por dónde nos movemos. Luego veremos el gráfico que nos proporcionará nuestro template de Zabbix en el que todo queda más claro.

Ahora vamos con el resto de la configuración. En nuestro servidor de Zabbix necesitaremos el script de python que obtendrá los datos del servidor web, luego el propio Zabbix se encargará de ejecutar este script y almacenarlos. En el enlace del proyecto podremos descargarlo. Antes de añadirlo debemos editar la configuración de Zabbix para que el servidor sepa dónde buscarlo para ejecutarlo. Abrimos el fichero /etc/zabbix/zabbix_server.conf y buscamos la línea correspondiente a los scripts externos:

[...]
### Option: ExternalScripts
#       Full path to location of external scripts.
#       Default depends on compilation options.
#
# Mandatory: no
# Default:
# ExternalScripts=${datadir}/zabbix/externalscripts
ExternalScripts=/etc/zabbix/externalscripts
[...]

Reiniciando el servidor haremos que los scripts que añadamos en ese directorio puedan ser ejecutados por Zabbix. Si el directorio no existiese debemos crearlo y tendremos que darle permisos de ejecución:

# mkdir /etc/zabbix/externalscripts
# chmod +x /etc/zabbix/externalscripts/getNginxInfo.py
# service zabix-server restart

Ahora importamos el template xml que también podemos descargar de la misma página. La importación es muy fácil, nos dirijimos a la parte de administración de Zabbix, Plantillas y dentro del formulario con la lista de templates veremos el botón de importar arriba en la parte derecha.

Cuando lo pinchemos nos aparecerá otro formulario en el que elegiremos el template que nos hemos descargado desde la página del proyecto y lo importaremos.

Todas las opciones que aparecen seleccionadas por defecto nos sirven, lo único que debemos hacer es seleccionar el xml correcto e importarlo. Después de subirlo Zabbix nos comunicará que el proceso se ha llevado a cabo correctamente mediante una bonita caja de color verde en la parte superior de la ventana.

Ahora sólo necesitaremos asociar la plantilla al servidor en el que se aloja Nginx. En la misma sección de configuración de plantillas buscaremos la nueva adquisición, en este caso Template Nginx Info y pincharemos en su nombre con lo que accederemos a la configuración del template. Simplemente tendremos que buscar el servidor en la columna derecha del apartado Templates y moverlo a la izquierda, guardar y listo.

Debemos recordar que el servidor de Zabbix debe tener conexión directa con el equipo que tiene Nginx funcionando. Cuando llevéis un tiempo con el servidor recopilando datos tendréis un gráfico similar a éste:

Lo sé, son unos datos muy pobres pero ya iremos mejorando. Este gráfico podréis obtenerlo si os dirigís a la sección Monitorización y dentro de ella a los Gráficos. Elegimos el grupo al que pertenece nuestro equipo, el propio equipo y dentro de sus gráficos el que se llama Connection Status. Debéis tener un poco de paciencia ya que los datos no salen al momento. Para asegurarnos de que se están recibiendo podemos dirigirnos al apartado Última Fecha, que está mal traducido ya que en realidad se refiere a los últimos datos recopilados para un equipo determinado. Realizamos la misma operación, pero elegimos sólo Grupo y dentro de él el Equipo, nos aparecerá una lista de indicadores y debemos tener uno llamado -other- dentro del cuál tendremos los datos referentes a la plantilla de Nginx. Si no nos aparece este campo debemos revisar el proceso desde el principio y en último caso activar la depuración en el servidor para poder encontrar la causa del error.

Ahora vamos con unas plantillas menos vistosas ya que no dan estadísitcas directas de cara al público pero que también son muy importantes. La primera de ellas es un tanto oscurantista, viene por defecto en la instalación de Zabbix pero hay que tirar de bastantes hilos para llegar a buen puerto.

Lo primero que debemos hacer es crearnos un archivo en el directorio del usuario de Zabbix, con este nombre concreto /var/run/zabbix/.my.cnf y con el siguiente contenido:

[client]
user=zabbix
password=<user_password>

Ahora le aplicaremos los permisos necesarios para que el agente pueda utilizarlo sin preguntar:

# chmod 0600 /var/run/zabbix/.my.cnf
# chown zabbix:zabbix /var/run/zabbix/.my.cnf

Ahora vamos a conceder los permisos al usuario zabbix que hemos referenciado en el archivo de credenciales para que pueda ejecutar queries en el servidor de MySQL. Con unos sencillos comandos en la consola de administración de la base de datos conseguiremos nuestro objetivo:

# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 68515
Server version: 5.5.43-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> GRANT ALL on *.* to 'zabbix'@'localhost' identified by '<user_password>';
mysql> flush privileges;

Lo siguiente que haremos es copiar el archivo que nos definirá los parámetros que necesita enviar el agente al servidor de Zabbix. Afortunadamente como esta plantilla está en la distribución oficial tenemos un archivo de ejemplo en los archivos que se instalan con el propio paquete. Debemos copiarlo al directorio de configuraciones del agente:

# cp /usr/share/doc/zabbix-agent/examples/userparameter_mysql.conf /etc/zabbix/zabbix_agentd.conf.d/

Si lo abrimos observaremos que la variable HOME no coincide con la ruta que hemos utilizado para el archivo de credenciales por lo que editaremos este archivo para que sepa encontrar lo necesario para obtener los datos a enviar, quedando como sigue:

# For all the following commands HOME should be set to the directory that has .my.cnf file with password information.

# Flexible parameter to grab global variables. On the frontend side, use keys like mysql.status[Com_insert].
# Key syntax is mysql.status[variable].
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/var/run/zabbix mysql -N | awk '{print $$2}'

# Flexible parameter to determine database or table size. On the frontend side, use keys like mysql.size[zabbix,history,data].
# Key syntax is mysql.size[<database>,<table>,<type>].
# Database may be a database name or "all". Default is "all".
# Table may be a table name or "all". Default is "all".
# Type may be "data", "index", "free" or "both". Both is a sum of data and index. Default is "both".
# Database is mandatory if a table is specified. Type may be specified always.
# Returns value in bytes.
# 'sum' on data_length or index_length alone needed when we are getting this information for whole database instead of a single table
UserParameter=mysql.size[*],echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema='$1'")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name='$2'");" | HOME=/var/run/zabbix mysql -N

UserParameter=mysql.ping,HOME=/var/run/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V

Después de estos sencillos pasos por fin podremos añadir la plantilla al servidor que queremos monitorizar. El proceso es similar al que hemos explicado antes para asociar el template de Nginx. Una vez que el agente esté enviando datos durante un periodo de tiempo podremos acceder a un par de gráficos interesantes. En el primero podremos ver el ancho de banda utilizado por MySQL hablando de datos solicitados y servidos. Aquí podéis ver un ejemplo:

En el segudno podréis ver detalladamente las operaciones que se han producido en el servidor de MySQL.

Cómo véis no hay mucha actividad, pero no os preocupéis, cuando tengamos que migrar de servidor por no soportar tantas peticiones ya ni nos acordaremos de cuando empezamos a montar esto.

El último de los templates es para monitorizar nuestro querido PostgreSQL. En nuestro caso lo utilizaremos para ver qué tal se comporta la base de datos que alimenta nuestro propio Zabbix ya que no tenemos ningún otro en producción.

Como en el caso del primer template, el de PostgreSQL no está dentro de la distribución oficial y tiene su propia página en GitHub, es un proyecto japonés pero afortunadamente las instrucciones están en inglés también. Lo primero que debemos hacer es descargarnos todos los archivos necesarios. Uno de ellos es la propia plantilla que debemos importar en el panel de control de Zabbix, pero el resto debemos copiarlos al servidor que queramos monitorizar.

La parte más fácil es la de importar los templates ya que la hemos hecho al principio de este artículo, la única consideración estriba en que este monitor posee cinco plantillas diferentes. El que nos interesa se llama Template_App_PostgreSQL.xml, los que contienen el sufijo SR se refieren a los servidores PostgreSQL que tienen una estructura de replicación y los dos últimos, pgpoolII, sirven para monitorizar servidores con el software intermedio de pool de conexiones que ahorra peticiones nuevas a la base de datos principal. De momento sólo utilizaremos el primero pero podemos importar los cinco para futuras configuraciones.

Una vez hecho esto pasamos directamente al servidor en el que tenemos PostgreSQL instalado. En el paquete que nos hemos descargado observamos tres directorios aparte del mencionado anteriormente. Vamos con el primero, usr-local-bin. Como su propio nombre indica contiene archivos que deberán ser copiados al directorio /usr/local/bin y son scripts que serán invocados por el agente para obtener los datos a enviar al propio servidor de Zabbix:

# cp usr-local-bin/* /usr/local/bin/
# chmod +x /usr/local/bin/*.sh

Ahora copiamos los archivos de configuración que utilizan los scripts instalados anteriormente:

# cp usr-local-etc/* /usr/local/etc/

Con las variables de serie debe funcionar, ya que el password de postgres nunca lo hemos cambiado y el puerto de escucha tampoco. Después de esto sólo nos resta copiar los user parameters en su lugar correspondiente:

# cp zabbix_agentd.d/userparameter_pgsql.conf /etc/zabbix/zabbix_agentd.conf.d

Aquí tampoco tenemos que editar nada siempre y cuando tengamos añadida esta línea en la configuración de nuestro agente:

Include=/etc/zabbix/zabbix_agentd.conf.d/

Os recuerdo que si tenemos que añadirla debemos reiniciar el servicio que controla nuestro agente para que el cambio surta efecto. Y listo, con toda la infraestructura montada sólo tenemos que asociar, en el panel de control, el template elegido a la máquina en cuestión y en unos segundos estaremos recolectando nuestros preciosos datos de uso de PostgreSQL.

Seguramente tengáis que reiniciar el agente de Zabbix en el servidor de PostgreSQL para que empiece a enviar datos. Para comprobarlos os dirigís al panel de control, seleccionáis Monitorización y dentro de esta sección Última Fecha, en inglés Latest Data y cuando esté enviando datos os aparecerán estos cuatro campos que os he destacado en rojo si elegís el servidor de Zabbix en el selector derecho superior del formulario:

Con los datos asegurados ya podréis ver los gráficos que nos proporcionan estas plantillas, el más útil será el de conexiones:

En este post me he explayado un poco de más pero creo que merece la pena ya que Zabbix es una de las herramientas más útiles que he implementado en mi día a día en Mirai. Este post tan largo además me ha hecho recordar una interminable jornada en un instituto un sábado por la mañana, sí, lo habéis adivinado, mi consejo musical de hoy está contenido en la banda sonora de esa gran película de los ochenta, El club de los cinco, The Breakfast Club en su título original. Por supuesto se trata de los Simple Minds y su melocotonazo Don't You (Forget About Me).

Para el que no conozca la definición de melocotonazo dejaré que el grandérrimo Fary os lo explique con sus propias palabras.

Disfruten.