"Después del juego es antes del juego"
Sepp Herberger

lunes, 6 de junio de 2022

Zabbix (III): creación de plantilla con items y triggers para agentes Linux.

Después de tener montado el Zabbix, van surgiendo nuevas necesidades para monitorizar nuestros clientes. En esta entrada voy a ver como he creado una plantilla para los Linux del IES, que me permite monitorizar varias cosas no previstas en la plantilla por defecto. Lo que haremos en primer lugar es crear la plantilla "Template IES Linex"
A continuación vamos definir los ítems que extraigan datos del cliente. Estos ítems son pequeños fragmentos de código con comandos de terminal Unix. Lo podemos hacer de dos maneras:
  1. Definir el código en el cliente dentro de /etc/zabbix/zabbix_agentd.conf.d/blablaba.conf y luego referenciarlo en el servidor Zabbix.
  2. Definir el código en el servidor Zabbix, dentro del mismo item usando system.run[...]
En el primer caso vamos a crear, por ejemplo, un ítem llamado "puppetcheck" que nos diga si la última ejecución de puppet ha acabado con éxito. Para ello lo primero es programar las instrucciones que hagan eso. Hay varias maneras de averiguarlo, como por ejemplo esta:
# cat /var/lib/puppet/state/last_run_report.yaml | grep -i -e "failed: true" -e "status: failed" | wc -l 
Esto nos devolverá 0 si no hay ningún error y >0 si hay algun error en la última ejecución de puppet. Esta secuencia de comandos ejecutada como usuario root funciona, pero hay que tener en cuenta que el agente Zabbix se ejecuta con el usuario zabbix y eso nos puede causar problemas. En este caso concreto el problema era el acceso al fichero /var/lib/puppet/state/last_run_report.yaml del cliente.

Para que el agente Zabbix pueda llegar hasta allí tenemos que echar mano de sudoers:
# cat /etc/sudoers.d/puppetcheck
Cmnd_Alias CHECKPUPPET = /bin/cat /var/lib/puppet/state/last_run_report.yaml
zabbix ALL=(ALL) NOPASSWD: CHECKPUPPET
Una vez hecho esto, ya podemos definir el parámetro que usará el ítem en el cliente:
# cat /etc/zabbix/zabbix_agentd.conf.d/checkpuppet.conf
UserParameter=system.puppetcheck,sudo cat /var/lib/puppet/state/last_run_report.yaml | grep -i -e "failed: true" -e "status: failed" | wc -l
. Una vez definido el item en los clientes, lo añadimos a la plantilla en el servidor Zabbix:
Además de crear el ítem, le añadimos una regla de preprocesamiento llamada "Discard unchanged with a heartbeat" que evita que se guarden valores repetidos consecutivos del ítem en el registro histórico. De esta manera solo guardamos el ítem cuando cambia su valor respecto a la actualización anterior (o, en este caso concreto, han pasado 12 horas desde la última actualización). La finalidad de esto es evitar guardar valores repetidos consecutivos de los ítems en toda la base de datos histórica.
Finalmente creamos un trigger para que avise cuando hay un error. En este caso vemos si hay error en puppet durante las 3 últimas actualizaciones del ítem:



Con esto tenemos el pack completo: parámetro defínido en el cliente Zabbix, asociado a un ítem en el servidor Zabbix y con un trigger que nos avisa este tiene un valor determinado.

La otra otra opción consiste en definir en el servidor Zabbix el ítem con el código a ejecutar en el cliente remoto. Por ejemplo, un ítem que muestre en cada momento que usuario ha hecho login en la máquina, definido así:
Parent items: Template Linux IES
Name: LoggedUser
Type: Zabbix agent
Uptdate time: 1m
Key: system.run["who | grep -v root | cut -d' ' -f1"]
El problema de este tipo de ítems es que debemos estar seguros de que el cliente Zabbix permite la ejecución remota de comandos, ya que si no es así el ítem no se actualizará nunca. De igual manera, si el agente se ejecuta en una máquina que está detrás de un firewall o un NAT tampoco podremos llegar a ella para ejecutar el comando desde el servidor Zabbix.

En este ítem LoggedUser tambien añadiremos una regla de preprocesamiento del tipo "Discard unchanged", para evitar guardar de forma repetida el usuario logado cada vez que se actualiza el ítem, y solo guardarlo cuando cambia entre una actualización y la siguiente.

Por último, comentar que una vez hemos definido los ítems tenemos la posibilidad de probarlos desde la línea de comandos para ver que tal funcionan. En el cliente local:
# zabbix_agentd -t system.puppetcheck
O de forma remota:
# zabbix_get -s 172.X.Y.Z -p 10050 -k system.puppetcheck
Bueno, pues con esto ya tenemos el armazón para añadir ítems y triggers a saco en nuestros clientes.
Aquí están los 3 camaradas taikonautas que han subido estos días en la Shenzou 14 para finalizar el montaje de la Estación Espacial China. Recordemos que esta estación existe porque USA se negó a dar acceso a China a la Estación Espacial Internacional, por lo que los chinos decidieron montarse su propia estación mastodóntica (que a diferencia de la de Bender, no tendrá casinos ni furcias (*)) adquiriendo en el proceso una experiencia y know-how que les vendrá de perlas.

Es lo que pasa cuando no se quiere colaborar internacionalmente. Avisados quedamos.

(*)

No hay comentarios:

Publicar un comentario