![]() |
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 monitorizados en el 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 TLS. Checkmk 2.2.0 introdujo la opción alternativa para seleccionar la dirección de transmisión con el modo push.
Sin embargo, hay entornos -por ejemplo, contenedores despojados, sistemas heredados o embebidos- en los que no se puede utilizar el Controlador de agentes. En estos 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 podrían exigir que se eviten acciones como la transmisión de datos como texto sin formato. Por ejemplo, los niveles de llenado de los sistemas de archivos podrían ser de poca utilidad para un atacante, pero las tablas de procesos o las listas de actualizaciones que faltan podrían ayudar a dirigir un ataque. Además, debería evitarse la práctica de abrir puertos adicionales en favor de utilizar los canales de comunicación existentes.
Los métodos universales para conectar 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 produce los datos del agente en la salida estándar, que Checkmk procesa exactamente igual que si procedieran de un agente "normal". Como los cambios en las fuentes de datos normalmente sólo afectan a los transportes, es importante que dejes el host en API integrations if configured, else Checkmk agent en la GUI de configuración.
La modularidad de Checkmk te ayuda a cumplir estos requisitos transmitiendo la salida de texto plano del agente a través de medios de transporte arbitrarios. En definitiva, la salida de texto plano del script del agente puede transportarse por cualquier medio: directo o indirecto, pull o push. He aquí algunos ejemplos de cómo hacer llegar los datos del agente al servidor Checkmk:
por correo electrónico
mediante acceso HTTP desde el servidor
mediante carga HTTP desde el host
mediante el acceso a un archivo que se ha copiado en el servidor utilizando
rsync
oscp
mediante un script que utilice HTTP para recuperar los datos de un servicio web.
Otra área de aplicación de los programas de fuentes de datos son los sistemas que no permiten la instalación de agentes, pero emiten datos de estado a través de la API-REST o de una interfaz Telnet. En estos casos, puedes escribir un programa de fuentes de datos que consulte la interfaz existente y genere una salida de 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 fuente de datos no es difícil. Se puede utilizar cualquier script y lenguaje 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 primer 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. Éstos 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á codificada como un script shell de tres líneas:
#!/bin/sh
echo '<<<df>>>'
echo 'My_Disk foobar 100 70 30 70% /my_disk'
No olvides hacer ejecutable el programa:
OMD[mysite]:~$ chmod +x local/bin/myds
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
mediante DNS, introduce este nombre como una "dirección IP" explícita.
A continuación, añade una regla en el conjunto de reglas Setup > Agents > Other integrations > Individual program call instead of agent access que se aplique a este host, e introduce myds
como programa ejecutable:

Cuando ahora vayas a la configuración de servicios del host en la GUI de Configuración, debería aparecer en la lista exactamente un servicio listo para iniciar la monitorización:

Añade este servicio a la monitorización, activa cambios y tu primer programa de fuente de datos estará en marcha. A modo de prueba, en cuanto modifiques los datos que está generando el programa, el siguiente check del sistema de archivos My_Disk
lo mostrará inmediatamente.
2.2. Diagnóstico de errores
Si algo no funciona correctamente, se puede comprobar la configuración del host introduciendo cmk -D
en la línea de comando 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
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
Un -v
duplicado debe generar un mensaje que indique que se invocará tu programa:
OMD[mysite]:~$ cmk -vvd myserver125
Calling: myds
<<<df>>>
My_Disk foobar 100 70 30 70% /my_disk
2.3. Transferencia del nombre de un host
El programa de nuestro ejemplo funciona realmente, pero no es muy útil, ya que siempre produce los mismos datos, independientemente del host para el que se invoque.
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. Si codificas $HOSTNAME$
como marcador de posición en la línea de comando, puedes permitir que esto se transfiera:

En este ejemplo, el programa myds
recibe el nombre del host como primer argumento. El siguiente ejemplo de programa lo produce para probarlo en forma de un local check. A través de $1
, toma el primer argumento y lo guarda para utilizarlo como resumen en la variable $HOST_NAME
. A continuación, se insertará en la salida del plugin del local check:
#!/bin/sh
HOST_NAME="$1"
echo '<<<local>>>'
echo "0 Hostname - My name is ${HOST_NAME}"
El descubrimiento de servicios encontrará entonces un nuevo servicio del tipo local
, en cuya salida se verá el nombre del host:

Desde aquí sólo hay un pequeño paso hasta un programa fuente de datos real que, por ejemplo, recupere datos a través de HTTP utilizando el comando curl
. Se permiten los siguientes marcadores de posición en la línea de comandos de un programa fuente de datos:
|
El nombre del host configurado en la Configuración. |
|
La dirección IP del host sobre el que se realizará la monitorización. |
|
La lista de todos los tags del host, separados por espacios en blanco - encierra este argumento entre comillas para evitar que el shell lo divida. |
Si tienes una monitorización dual que utiliza IPv4 e IPv6, las siguientes macros pueden resultarte interesantes:
|
La dirección IPv4 del host |
|
La dirección IPv6 del host |
|
El número |
2.4. Tratamiento de errores
Independientemente de tu ocupación real en TI, gran parte de tu tiempo lo pasarás lidiando con errores y problemas. Los programas de fuentes de datos no se libran de ellos. 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:
Cualquier código de salida distinto de
0
se tratará como un error.Los mensajes de error se esperan en el canal de error estándar (
stderr
).
Si un programa fuente de datos falla
Checkmk descarta los datos de usuario completos de la salida,
Checkmk establece el servicio Checkmk 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
:
#!/bin/sh
HOST_NAME=$1
echo "<<<local>>>"
echo "0 Hostname - My name is $HOST_NAME"
echo "This didn't work out" >&2
exit 1
Como servicio Checkmk tendrá este aspecto:

Si escribes tu programa como un script shell, justo al principio puedes codificar la opción set -e
:
#!/bin/sh
set -e
En cuanto una instrucción produzca un error (es decir, un código de salida distinto de 0
), el intérprete de comandos se detendrá inmediatamente y emitirá el código de salida 1
. De este modo, tendrás un tratamiento genérico de los errores y no deberás comprobar si cada una de las instrucciones tiene éxito.
3. Agentes especiales
Con Checkmk se suministran una serie de programas de fuentes de datos que se necesitan a menudo. Éstos generan salidas de agente no sólo llamando a un agente Checkmk normal de forma indirecta, sino que han sido concebidos especialmente para la consulta de hardware o software concretos.
Como estos programas a veces requieren parámetros bastante complejos, hemos definido conjuntos de reglas especiales en la GUI de Configuración que te permiten configurarlos directamente. Puedes encontrar estos conjuntos de reglas agrupados por casos de uso en Setup > Agents > VM, cloud, container y Setup > Agents > Other integrations.

![]() |
A quienes hayan pasado de versiones anteriores de Checkmk puede sorprenderles la nueva agrupación: Checkmk 2.0.0 ya no agrupa según la técnica de acceso, sino por el tipo de objeto monitorizado. Esto es especialmente útil porque, en muchos casos, al usuario no le interesa qué técnica se utiliza para recuperar los datos y, además, a menudo se combinan fuentes de datos y piggyback, por lo que aquí no es posible una delimitación clara. |
Estos programas también se conocen como agentes especiales, porque son una alternativa especial a los agentes Checkmk normales. Tomemos como ejemplo la monitorización de los archivadores NetApp. Éstos no permiten la instalación de agentes Checkmk. La interfaz SNMP es lenta, defectuosa e incompleta. Sin embargo, existe una interfaz HTTP especial que proporciona acceso al sistema operativo Ontap de NetApp y a todos los datos de monitorización.
El agente especial agent_netapp_ontap
accede a esta interfaz a través de una API-REST y se configura como un programa de origen de datos utilizando el conjunto de reglas NetApp via Ontap REST API. Los datos que necesita el agente especial pueden introducirse en el contenido de la regla, que casi siempre es algún tipo de dato de acceso. Con el agente especial de NetApp también hay una caja de check adicional para el registro de métricas (que aquí puede ser bastante exhaustivo):

Es importante que dejes el host configurado en API integrations if configured, else Checkmk agent en la GUI de configuración.
Hay raras ocasiones en las que se desea consultar tanto un agente especial como el agente normal. Un ejemplo de ello es la monitorización de VMware ESXi a través del vCenter. Este último se instala en una máquina (normalmente virtual) Windows, en la que razonablemente también se ejecuta un agente Checkmk.

Los agentes especiales se instalan en ~/share/check_mk/agents/special/
. Si quieres modificar un agente de este tipo, copia primero el archivo con el mismo nombre en ~/local/share/check_mk/agents/special/
y haz tus cambios en esa nueva versión.
4. Archivos y directorios
Ruta | Función |
---|---|
|
Es el repositorio de programas y scripts propios que deben estar en una ruta de búsqueda, y que se pueden ejecutar directamente sin especificar la ruta. Si un programa está tanto en |
|
Los agentes especiales proporcionados con Checkmk se instalan aquí. |
|
El repositorio para tus propios agentes especiales modificados. |