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 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 o scp

  • 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:

~/local/bin/myds
#!/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:

Input mask for an individual command.

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:

The new service has been detected.

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:

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 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:

~/local/bin/myds
#!/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:

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

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:

$HOSTNAME$

El nombre del host configurado en la Configuración.

$HOSTADDRESS$

La dirección IP del host sobre el que se realizará la monitorización.

$_HOSTTAGS$

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:

$_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. 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:

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

  2. 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:

~/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

Como servicio Checkmk tendrá este aspecto:

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

Si escribes tu programa como un script shell, justo al principio puedes codificar la opción set -e:

~/local/bin/myds
#!/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.

Rule sets for monitoring applications by datasource and piggyback.
Conjuntos de reglas en Setup > Agents > Other integrations
Tip

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):

Rule for configuring the NetApp special agent.

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.

Query type options in the VMware ESXi configuration.

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

~/local/bin/

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 ~/bin/ como en ~/local/bin/, este último tiene prioridad.

~/share/check_mk/agents/special/

Los agentes especiales proporcionados con Checkmk se instalan aquí.

~/local/share/check_mk/agents/special/

El repositorio para tus propios agentes especiales modificados.

En esta página