- Definir el código en el cliente dentro de /etc/zabbix/zabbix_agentd.conf.d/blablaba.conf y luego referenciarlo en el servidor Zabbix.
- Definir el código en el servidor Zabbix, dentro del mismo item usando system.run[...]
# 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