Checkmk
to checkmk.com
Important

This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved.

1. Introducción

Checkmk suele acceder a los hosts supervisados en modo pull a través de una conexión TCP al puerto 6556. A partir de la versión 2.1.0, en la mayoría de los casos el Controlador de agentes escucha en este puerto, que reenvía la salida del agente a través de una conexión cifrada con TLS. Checkmk 2.2.0 introdujo la opción alternativa de seleccionar la dirección de transmisión con el modo push.

Sin embargo, hay entornos —por ejemplo, contenedores simplificados, sistemas heredados o integrados— en los que no se puede utilizar el Controlador de agentes. En tales casos se aplica el modo Legacy, en el que (x)inetd ejecuta el script del agente tras establecer una conexión, la salida del agente se transfiere como texto sin formato y la conexión se cierra inmediatamente después.

En muchas situaciones, las directivas de seguridad pueden exigir que se eviten acciones como la transmisión de datos en texto sin formato. Por ejemplo, los niveles de llenado de los sistemas de archivos pueden ser de poca utilidad para un atacante, pero las tablas de procesos o las listas de actualizaciones pendientes podrían ayudarle a dirigir un ataque. Además, se debe evitar la práctica de abrir puertos adicionales y optar por utilizar los canales de comunicación existentes.

Los métodos universales para realizar la conexión de estos procedimientos de transferencia a Checkmk son los programas de fuentes de datos. La idea es muy sencilla: se pasa un comando como texto a Checkmk. En lugar de conectarse al puerto 6556, Checkmk ejecuta este comando. Esto genera los datos del agente en la salida estándar, que luego Checkmk procesa exactamente igual que si provinieran de un agente «normal». Dado que los cambios en las fuentes de datos suelen afectar solo a los transportes, es importante que dejes el host en «API integrations if configured, else Checkmk agent» en la GUI.

La modularidad de Checkmk te ayuda a cumplir estos requisitos transmitiendo la salida de texto sin formato del agente a través de cualquier medio de transporte. En definitiva, la salida de texto sin formato del script del agente puede transportarse por cualquier medio: directo o indirecto, pull o push. Aquí tienes algunos ejemplos de cómo enviar los datos del agente al servidor Checkmk:

  • por correo electrónico

  • a través de acceso HTTP desde el servidor

  • mediante carga HTTP desde el host

  • mediante el acceso a un archivo que se ha copiado al servidor usando rsync o scp

  • a través de un script que usa HTTP para recuperar los datos de un servicio web

Otra área de aplicación de los programas de origen de datos son los sistemas que no permiten la instalación de agentes, pero que emiten datos de estado a través de una API-REST o una interfaz Telnet. En tales casos, puedes escribir un programa de origen de datos que consulte la interfaz existente y genere la salida del agente a partir de los datos obtenidos.

2. Escribir programas de fuentes de datos

2.1. El programa más sencillo posible

Escribir e instalar un programa de origen de datos no es difícil. Se puede usar cualquier lenguaje de script y de programación compatible con Linux. Lo mejor es guardar el programa en el directorio ~/local/bin/, donde siempre se encontrará automáticamente sin necesidad de especificar una ruta de datos.

El siguiente ejemplo, muy básico, se llama myds y genera datos de monitorización sencillos y ficticios. En lugar de integrar una nueva ruta de transporte, genera los datos de monitorización por sí mismo. Estos consisten en una sección <<<df>>>, que contiene la información de un único sistema de archivos, y que tiene un tamaño de 100 kB y el nombre My_Disk. Está codificado como un script shell de tres líneas:

~/local/bin/myds
#!/bin/sh
echo '<<<df>>>'
echo 'My_Disk  foobar  100 70 30  70% /my_disk'
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

No te olvides de hacer el programa ejecutable:

OMD[mysite]:~$ chmod +x local/bin/myds
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Ahora crea un host de prueba en la configuración, por ejemplo, myserver125. Esto no requiere una dirección IP. Para evitar que Checkmk intente resolver myserver125 a través del DNS, introduce este nombre como una «dirección IP» explícita.

A continuación, añade una regla en el conjunto de reglas de Setup > Agents > Other integrations > Individual program call instead of agent access que se aplique a este host e introduce myds como programa ejecutable:

Input mask for an individual command.

Ahora, cuando vayas a la configuración de servicios del host en la GUI, debería aparecer exactamente un servicio listo para empezar la monitorización:

The new service has been detected.

Añade este servicio a la monitorización, activa los cambios y tu primer programa de fuente de datos estará en funcionamiento. A modo de prueba, tan pronto como modifiques los datos generados por el programa, la siguiente check del sistema de archivos de My_Disk lo mostrará inmediatamente.

2.2. Diagnóstico de errores

Si algo no funciona correctamente, puedes checkear la configuración del host introduciendo cmk -D en la línea de comandos y ver si tu regla surte efecto:

OMD[mysite]:~$ cmk -D myserver125

myserver125
Addresses:              myserver125
Tags:                   [address_family:ip-v4-only], [agent:cmk-agent], [criticality:prod], [ip-v4:ip-v4], [networking:lan], [piggyback:auto-piggyback], [site:mysite], [snmp_ds:no-snmp], [tcp:tcp]
Host groups:            check_mk
Agent mode:             Normal Checkmk agent, or special agent if configured
Type of agent:
Program: myds
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Con un cmk -d puedes activar la recuperación de los datos del agente, así como la ejecución de tu programa:

OMD[mysite]:~$ cmk -d myserver125
<<<df>>>
My_Disk  foobar  100 70 30  70% /my_disk
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Un «-v» duplicado debería generar un mensaje indicando que se invocará tu programa:

OMD[mysite]:~$ cmk -vvd myserver125
Calling: myds
<<<df>>>
My_Disk  foobar  100 70 30  70% /my_disk
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

2.3. Transferencia del nombre del host

El programa de nuestro ejemplo funciona, pero no es muy útil, ya que siempre genera los mismos datos, independientemente del host para el que se ejecute.

Un programa real que, por ejemplo, recupere datos a través de HTTP desde algún lugar, requiere al menos el nombre del host desde el que debe recuperar los datos. Al codificar $HOSTNAME$ como marcador de posición en la línea de comandos, puedes permitir que se transfiera:

Passing the host name with the $HOSTNAME$ macro.

En este ejemplo, el programa myds recibe el nombre del host como primer argumento. El siguiente ejemplo de programa genera esto para realizar una prueba en forma de local check. A través de $1, toma el primer argumento y lo guarda para utilizarlo como Vista general en la variable $HOST_NAME. Esto se insertará luego en la salida del plugin del local check:

~/local/bin/myds
#!/bin/sh
HOST_NAME="$1"

echo '<<<local>>>'
echo "0 Hostname - My name is ${HOST_NAME}"
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

El descubrimiento de servicios encontrará entonces un nuevo servicio del tipo local, en cuya salida se verá el nombre del host:

The service discovery finds the new service, which now outputs the passed host name as information.

A partir de aquí, solo queda un pequeño paso para crear un programa de fuente de datos real que, por ejemplo, recupere datos a través de HTTP utilizando el comando curl. En la línea de comandos de un programa de fuente de datos se permiten los siguientes marcadores de posición:

$HOSTNAME$

El nombre del host tal y como está configurado en la configuración.

$HOSTADDRESS$

La dirección IP del host que se va a realizar la monitorización.

$_HOSTTAGS$

La lista de todos los tags del host, separados por espacios en blanco; incluye este argumento entre comillas para evitar que el shell lo divida.

Si tienes una monitorización dual usando IPv4 e IPv6, las siguientes macros pueden resultarte interesantes:

$_HOSTADDRESS_4$

La dirección IPv4 del host

$_HOSTADDRESS_6$

La dirección IPv6 del host

$_HOSTADDRESS_FAMILY$

El número «4» si se utiliza la dirección IPv4 para la monitorización; en caso contrario, «6».

2.4. Manejo de errores

Independientemente de cuál sea tu trabajo en el ámbito de la TI, dedicarás gran parte de tu tiempo a lidiar con errores y problemas. Los programas de fuentes de datos no son una excepción. Especialmente en el caso de los programas que proporcionan datos a través de redes, no es realista esperar que estén libres de errores.

Para que Checkmk pueda comunicar un error a tu programa de forma ordenada, se aplica lo siguiente:

  1. Cualquier código de salida distinto de 0 se considerará un error.

  2. Se esperan mensajes de error en el canal de error estándar (stderr).

Si falla un programa de origen de datos,

  • Checkmk descarta todos los datos de usuario de la salida,

  • Checkmk establece el servicio Check_MK en CRIT e identifica los datos de stderr como un error,

  • y los servicios reales permanecen en su estado anterior (y se volverán obsoletos con el tiempo).

Podemos modificar el ejemplo anterior para que simule un error. Con la redirección >&2, el texto se desviará a stderr, y exit 1 establece el código de salida del programa en 1:

~/local/bin/myds
#!/bin/sh
HOST_NAME=$1

echo "<<<local>>>"
echo "0 Hostname - My name is $HOST_NAME"

echo "This didn't work out" >&2
exit 1
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Como servicio deCheck_MK, se verá así:

If a script returns exit codes different from 0, the 'Check_MK' service will immediately CRIT (red).

Si estás escribiendo tu programa como un script shell, justo al principio puedes incluir la opción de «set -e»:

~/local/bin/myds
#!/bin/sh
set -e
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

En cuanto una instrucción produce un error (es decir, el código de salida no es 0), el shell se detiene inmediatamente y emite el código de salida 1. De este modo, dispones de un manejo genérico de errores y no es necesario que checkes el éxito de cada instrucción individualmente.

3. Agentes especiales

Checkmk incluye varios programas de fuentes de datos que se utilizan con frecuencia. Estos agentes especiales se describen en un artículo aparte.

4. Archivos y directorios

Ruta Función

~/local/bin/

El repositorio para tus propios programas y scripts que deben estar en la ruta de búsqueda, y que se pueden ejecutar directamente sin especificar la ruta. Si un programa está tanto en ~/bin/ como en ~/local/bin/, este último tiene prioridad.


Last modified: Tue, 11 Nov 2025 08:13:48 GMT via commit 7ce3decaf
En esta página