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
En este punto, damos por hecho que ya te has familiarizado con los conceptos básicos de los programas de fuentes de datos y los agentes especiales, y que entiendes sus mecanismos básicos. Los agentes especiales añaden una configurabilidad sencilla a un programa de fuente de datos. Para ello se utilizan las reglas de la configuración. La configurabilidad puede afectar tanto al alcance y al tipo de datos recuperados como a su preprocesamiento antes de que se transfieran como salida del agente a la cadena de procesamiento posterior.
Cada agente especial es un programa ejecutable de forma independiente sin dependencias de las interfaces de programación de Checkmk. Al igual que con los programas de fuentes de datos, los agentes especiales también se invocan en el intervalo de comprobación habitual (normalmente un minuto por defecto). El agente especial inicia un proceso y la salida del agente se transfiere a la salida estándar. A continuación, el agente especial se cierra. Esto te permite implementar agentes especiales en cualquier lenguaje de programación. Sin embargo, los procesos de corta duración hacen que los lenguajes compilados en tiempo real, como Java, sean menos adecuados que los lenguajes compilados o los lenguajes interpretados de inicio rápido.
Los procesos activados se configuran mediante parámetros de línea de comandos cuando se invoca el agente especial. Para ello, debes determinar cómo se asignarán los elementos de la interfaz gráfica de usuario, como los campos de entrada de texto o las casillas de verificación, a parámetros específicos.
Los ejemplos de código creados para este artículo están disponibles en nuestro repositorio de GitHub y el agente especial Open-Meteo terminado está disponible como MKP en el Checkmk Exchange.
2. Creación de un agente especial «mínimo»
Al desarrollar agentes especiales, también debes asegurarte de utilizar el usuario del sitio correspondiente para la creación del archivo. Si los propietarios o los permisos no están definidos correctamente, esto puede provocar problemas e incompatibilidades. |
A diferencia del programa de origen de datos, un agente especial no puede estar ubicado en cualquier lugar del sistema de archivos.
Tiene su ubicación específica en la jerarquía de directorios de Checkmk.
Además, el nombre del archivo debe comenzar por agent_.
Por otra parte, los agentes especiales siempre deben darse a conocer al sitio de Checkmk.
Por lo tanto, un agente especial mínimo y ejecutable requiere al menos tres archivos: el agente especial, la configuración de reglas y la configuración de llamadas.
2.1. Preparación del entorno
Como paso preparatorio, debes crear tres directorios, todos ellos ubicados en ~/local/lib/python3/cmk_addons/plugins/<plug-in_family>.
El cuarto directorio que se muestra en el ejemplo siguiente es opcional: puede utilizarse para una comprobación basada en un agente.
2.2. El agente especial
¿Qué podría ser más adecuado como agente especial mínimo que una comprobación local que proporcione un servicio «Hello World!»? Incluso un sencillo script de shell que genere dos líneas de salida puede hacerlo:
Este script no debe tener extensión de archivo. |
No te olvides: el archivo debe ser ejecutable:
Esto asignará los permisos necesarios:
para el propietario del archivo (lectura, escritura, ejecución)
para el grupo asociado al archivo (lectura, ejecución)
para otros usuarios (lectura, ejecución).
2.3. Configuración de la regla
Ahora se ha creado una regla mínima:
Se definen el título y la categoría.
El formulario de la interfaz gráfica de usuario para la configuración permanece vacío.
El «name» hace referencia al nombre del agente especial, al que se le asigna el prefijo «agent_».
Un agente configurado de esta manera estará disponible en «Other integrations».
Sin embargo, su plantilla de configuración no contiene entradas debido a que «elements={}» está vacío.
2.4. La configuración de la llamada
Esta configuración combina el agente especial que se va a ejecutar con los ajustes obtenidos de la interfaz gráfica de usuario y los ajustes predeterminados.
Estos ajustes se convierten ahora en parámetros de llamada.
name vuelve a referirse al nombre del agente especial, al que se le añade el prefijo agent_.
Esto proporciona los requisitos básicos para el agente especial. Por supuesto, puedes añadir más información a estos en cualquier momento.
2.5. La primera prueba
Una vez creados los archivos, comprueba primero si Checkmk puede validarlos:
A continuación, reinicia el servidor web del sitio:
Si quieres que la nueva regla sea visible en la búsqueda de inmediato, tendrás que reiniciar la base de datos en memoria Redis:
Si ahora abres Setup > Agents > Other integrations, deberías ver la nueva entrada «Hello special!» en la sección «Custom integrations».
Si no aparece, comprueba primero si has guardado todos los archivos en la ubicación indicada. Si buscas otras posibles causas de error, en las ediciones comerciales puedes hacerlo cómodamente a través de la administración de los paquetes de extensión de Checkmk. Como alternativa, hemos enumerado las causas de error más importantes y las posibles soluciones en el capítulo Solución de problemas.
3. Un ejemplo más complejo: un servicio meteorológico completo
Una comprobación que nunca cambia de estado es, bueno, bastante predecible. Así que nos atreveremos a dar el paso hacia un agente especial «real» que consulta una API web o REST y recibe un objeto como estructura JSON o XML en respuesta. Estos son también formatos de datos típicos a la hora de acceder a las API de dispositivos de red, como los dispositivos SAN.
Para que no necesites ningún hardware específico para este ejercicio, utilizaremos la API gratuita de Open-Meteo.com.
Nuestro objetivo es escribir un agente especial completo que se configure con latitud y longitud.
Para que el ejercicio sea sencillo, el agente especial también interpretará los datos directamente.
Por ejemplo, el agente especial debería asumir el estado «WARN» para temperaturas por debajo de 5 grados Celsius, y el estado «CRIT» para temperaturas por debajo de 0 grados.
Abreviaremos nuestra comprobación como «ometemp», el agente especial como «agent_ometemp» y así sucesivamente.
Open-Meteo permite el uso gratuito con fines no comerciales y se reserva el derecho a bloquear direcciones IP si hay demasiadas solicitudes. La consulta minuto a minuto de la API sigue estando dentro de unos límites tolerables. No obstante, no debes abusar del servicio y debes eliminar las reglas de agentes especiales que utilicen este servicio una vez que las pruebas hayan salido bien. ¡Ten especial cuidado de asegurarte de que las reglas de asignación de agentes especiales creadas para la prueba solo se apliquen a un host y no a docenas o cientos! |
3.1. Preparación del entorno
Al igual que en el ejercicio anterior, primero crea los directorios necesarios, esta vez con el nombre ometemp en lugar de hellospecial.
3.2. El agente especial
Ahora que hay que procesar datos reales, también tendrás que pensar, por ejemplo, en el lenguaje de programación y el preprocesamiento.
Nuestro ejercicio consulta una API pública y recibe datos JSON.
Esto se podría hacer en el shell con un comando curl.
Sin embargo, dado que Checkmk viene con un Python bien equipado, tiene sentido utilizarlo.
La siguiente decisión tiene que ver con el procesamiento de los datos. Por ejemplo, puedes simplemente pasar los datos JSON a la salida del agente o convertirlos a un formato de tabla en el agente especial. En la práctica, normalmente decidirás esto en función de tu entorno de trabajo: ¿Se ha tenido en cuenta la «división del trabajo» al desarrollar tu comprobación? ¿Los datos preparados simplifican el desarrollo del complemento de comprobación basado en el agente asociado? ¿O incluso lo hacen innecesario? Esto último ocurre si los datos se pueden preparar de tal manera que se puedan analizar con un complemento de comprobación ya existente.
Nuestro ejemplo simplemente reenvía la respuesta JSON.
El análisis se lleva a cabo entonces en el complemento de comprobación basado en agente.
La longitud y la latitud se introducen mediante los argumentos de línea de comandos --latitude y --longitude.
Para poder leer mejor los argumentos de línea de comandos, utilizamos la biblioteca argparse.
Dado que Open-Meteo admite la latitud y la longitud codificadas en la URL, basta con una URL con marcadores de posición.
Prueba esta URL en el navegador con tu propia latitud y longitud.
Recordatorio: este script no debe tener extensión de archivo. |
La sección del agente ometemp solo contendrá el objeto JSON recibido.
Prueba el agente especial ejecutándolo desde la línea de comandos.
Tu salida en la línea de comandos debería verse ahora algo así:
<<<ometemp:sep(0)>>>
{'latitude': 48.14, 'longitude': 11.6, 'generationtime_ms': 0.01728534698486328, 'utc_offset_seconds': 0, 'timezone': 'GMT', 'timezone_abbreviation': 'GMT', 'elevation': 536.0, 'current_units': {'time': 'iso8601', 'interval': 'seconds', 'temperature_2m': '°C'}, 'current': {'time': '2025-01-09T12:45', 'interval': 900, 'temperature_2m': 9.8}}3.3. La configuración de la regla
El siguiente paso es la configuración de reglas para el agente. Una vez completada, esta regla se mostrará en Setup > Agents > Other integrations, en la agrupación «Environmental».
Los encabezados de la agrupación en Setup > Agents > Other integrations se mostrarán de forma dinámica. Esto significa que solo podrás ver la agrupación «Environmental» una vez que esté disponible el primer agente especial clasificado en ella. En la sección «Archivos y directorios» al final de este artículo encontrarás una descripción general (no exhaustiva) de las agrupaciones disponibles. |
Con esto, también se ha creado el agente especial.
Después de comprobarlo en cmk-validate-plugins, reinicia el servidor web del sitio:
Ahora se podría crear una regla basada en este agente especial con Add rule: Open-Meteo temperature. Sin embargo, esta regla aún no servirá de mucho, ya que actualmente solo contiene los dos campos para introducir la longitud y la latitud.
Extensión: Uso de contraseñas
En muchos casos se requiere un nombre de usuario y una contraseña o una clave API para acceder a los datos.
Hay elementos de «formspec» independientes disponibles para gestionar las contraseñas.
Estos te permiten definir contraseñas ad hoc o acceder al almacén de contraseñas.
En este ejemplo, se puede utilizar la siguiente extensión del script creado anteriormente para este fin.
Amplía la primera línea con las variables adicionales e inserta las nuevas secciones del programa:
No olvides reiniciar el servidor web del sitio después de editar (en este caso, ampliar) un script.
Como el ejemplo con Open-Meteo no requiere contraseña, aquí mostramos el manejo básico de las contraseñas, pero no las incluimos en la llamada a la API.
3.4. La configuración de la llamada
A continuación, ampliamos el nuevo agente especial para que no solo contenga la longitud y la latitud, sino que también las procese. Nuestro objetivo final es obtener los valores de temperatura actuales para nuestra ubicación. Por lo tanto, la siguiente configuración combina el agente especial que se va a ejecutar con los ajustes obtenidos de la interfaz gráfica de usuario —es decir, de nuestra sección de reglas existente— y los ajustes de los estándares.
Los valores de longitud y latitud, que normalmente puedes especificar, se transfieren ahora al diccionario denominado «params».
Al mismo tiempo, el objeto «host_config» contiene todos los ajustes específicos del host que se van a utilizar aquí.
Por ejemplo, «host_config.primary_ip_config.address» te da acceso a la dirección IP principal, y «host_config.name» contiene el nombre del host.
Al transferir al agente especial, ten en cuenta que la llamada se realiza a través de un shell.
Por lo tanto, la lista de parámetros de llamada solo puede contener cadenas de caracteres.
Los ajustes se convierten entonces en parámetros de llamada que terminan en la lista command_arguments.
Uso de contraseñas
El ejemplo que se muestra aquí pasa las contraseñas en texto plano como argumentos de la línea de comandos.
Sin medidas de seguridad adicionales, estas contraseñas podrían leerse desde la tabla de procesos, por ejemplo.
Esta vulnerabilidad puede minimizarse cambiando la entrada en la tabla de procesos al iniciar el programa.
En Python, por ejemplo, esto se puede hacer con el módulo ` |
Como las contraseñas se almacenan como un objeto, el acceso se realiza a través de la función `unsafe()` de ese objeto:
3.5. El complemento de comprobación
Para completar la información, aquí también te mostramos el complemento de verificación basado en agentes. El desarrollo de estos complementos se describe en detalle en el artículo sobre complementos de verificación basados en agentes.
Una diferencia con respecto al ejemplo mencionado en el artículo es la transferencia del JSON devuelto por la API REST:
El complemento de verificación siempre recibe la sección del agente como una lista bidimensional («lista de listas») de cadenas.
En primer lugar, usamos `itertools` para convertir esta lista bidimensional en una unidimensional.
A continuación, concatenamos esta matriz resultante con espacios, lo que convierte toda la sección del agente en una sola cadena.
Por último, nos aseguramos de sustituir las comillas simples por comillas dobles para poder cargar la cadena directamente como un objeto con `json.loads()`.
3.6. Pruebas finales
Siempre es buena idea ejecutar una validación con cmk-validate-plugins si has realizado cambios en elementos que se ejecutan dentro de los procesos de Checkmk.
En este artículo, estos incluyen reglas, configuración de llamadas y complementos de comprobación.
Si solo has realizado cambios en la configuración de llamadas y en el propio agente especial, basta con generar una nueva configuración para el núcleo de monitorización y reiniciarlo. Esto se hace con el comando:
Si también has modificado reglas o complementos de comprobación, primero genera la configuración para el núcleo de monitorización y, a continuación, reinicia todo el sitio:
Los scripts descritos en este artículo para el agente especial, la configuración de reglas y la configuración de llamadas, cuando se utilizan en combinación con este complemento de comprobación, deberían proporcionarte ahora un servicio operativo en Checkmk:

4. Solución de problemas
Incluso cuando desarrollas tus propios agentes especiales, pueden surgir (por desgracia) errores y problemas.
Identificar la causa de un error es tan importante como solucionarlo.
Para hacerte una idea inicial de las posibles causas, primero deberías ejecutar cmk-validate-config.
Las siguientes secciones te ayudarán a aislar aún más el origen del problema.
4.1. Advertencias en la vista general del servicio del host
Si el servicio Check_MK cambia repentinamente su estado a «WARN» o «CRIT» después de que se haya activado su agente especial, echa un vistazo a su Summary asociado.

Si el Summary indica una conexión con el nuevo agente especial, comprueba las propiedades del host. Debe seleccionarse el valor Configured API integrations and Checkmk agent para el parámetro Checkmk agent / API integrations.

4.2. La regla ha desaparecido o aparece una advertencia
Si tu agente especial no aparece (o ya no aparece) en Checkmk en «Setup > Agents > Other integrations», puede que haya un error en la configuración de la regla (rulesets/special_agent.py).
Si utilizas una de las ediciones comerciales, es posible que veas una advertencia en rojo al intentar editar la regla o crear una nueva.
Sigue el enlace a la página de informes de errores.
Allí se mostrará la posible causa del problema.
A continuación, consulta las descripciones de los errores:
Por ejemplo, recibirás un mensaje como este:
2024-12-17 10:15:51,742 [40] [cmk.web 2669118] Error converting to legacy rulespec 'ometemp' : name 'migrate_to_password' is not definedComprueba la sintaxis de tu archivo `rulesets/special_agent.py`.
Comprueba si se han tenido en cuenta todas las bibliotecas necesarias y si se han importado todas las variables.
Comprueba si todas las sangrías son correctas y revisa toda la sintaxis.
Si tu regla era visible anteriormente en Checkmk y, tras una modificación de la configuración de la regla, ha desaparecido de repente, solo lo notarás si quieres adaptar reglas existentes o crear reglas nuevas. El problema no afectará a la monitorización de los servicios existentes. |
4.3. Mensajes de error al activar cambios
También puede haber un problema en la configuración de la llamada o en el propio agente especial. Esto se hace evidente, por ejemplo, porque aparece una advertencia amarilla durante Activate changes.
Comprueba el archivo server_side_calls/special_agent.py siguiendo la información del mensaje de error.
Si esto no resuelve el error, puedes volver a buscar mensajes de error en la línea de comandos:
Tras esperar un momento, obtendrás un resultado similar al siguiente (aquí abreviado para mayor claridad):
Traceback (most recent call last):
File "/omd/sites/devtest/bin/cmk", line 118, in <module>
exit_status = modes.call(mode_name, mode_args, opts, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/modes/__init__.py", line 70, in call
return handler(*handler_args)
^^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/modes/check_mk.py", line 562, in mode_dump_agent
for source in sources.make_sources(
^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 407, in make_sources
return _Builder(
^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 140, in __init__
self._initialize_agent_based()
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 198, in _initialize_agent_based
special_agents = tuple(make_special_agents())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 187, in make_special_agents
for agent_data in special_agent.iter_special_agent_commands(agentname, params):
File "/omd/sites/devtest/lib/python3/cmk/base/server_side_calls/_special_agents.py", line 139, in iter_special_agent_commands
yield from self._iter_commands(special_agent, params)
File "/omd/sites/devtest/lib/python3/cmk/base/server_side_calls/_special_agents.py", line 115, in _iter_commands
for command in special_agent(processed.value, self.host_config):
File "/omd/sites/devtest/local/lib/python3/cmk_addons/plugins/ometemp/server_side_calls/special_agent.py", line 13, in _agent_arguments
"--user", params['bulla'],
~~~~~~^^^^^^^^^
KeyError: 'bulla'Las últimas líneas del resultado son especialmente interesantes:
En el archivo server_side_calls/special_agent.py se está intentando acceder a un elemento del diccionario params que no existe.
4.4. Verificación de la salida del agente
Otra posible causa del error puede ser que el complemento de comprobación no esté generando ningún dato. Esto también se puede comprobar en la línea de comandos:
Si aquí recibes un mensaje de error en lugar de una cadena con los datos de medición actuales, utiliza el mensaje de error para corregirlo.
5. Archivos y directorios
5.1. Directorios
| Ruta del archivo | Descripción |
|---|---|
|
Directorio base para guardar los archivos de los complementos. |
|
Ubicación de almacenamiento de los archivos ejecutables. |
|
Ubicación de almacenamiento de los archivos de conjuntos de reglas. |
|
Ubicación de almacenamiento de los archivos de configuración de llamadas. |
|
Ubicación de almacenamiento para los complementos de comprobación basados en agentes. |
|
Los agentes especiales estándar se instalan aquí. |
|
Almacenamiento de los agentes especiales que hayas modificado. |
|
Almacenamiento de tus propios programas o scripts que deben estar en la ruta de búsqueda y que se pueden ejecutar directamente sin especificar una ruta de archivo. Si un programa se encuentra tanto en |
5.2. Agrupaciones disponibles enOther integrations
| Nombre | Descripción |
|---|---|
|
Supervisión de aplicaciones |
|
Supervisión de la nube |
|
Supervisión de sistemas de gestión de la configuración |
|
Supervisión de bases de datos |
|
Todo lo que no encaja en ninguna otra categoría |
|
Supervisión del entorno y las instalaciones |
|
Supervisión del sistema operativo Linux |
|
Supervisión de la red |
|
Supervisión del middleware |
|
Supervisión de los sistemas de notificación |
|
Supervisión del sistema operativo en general |
|
Supervisión de dispositivos periféricos |
|
Supervisión de la fuente de alimentación |
|
Supervisión del hardware del servidor |
|
Supervisión de los sistemas de almacenamiento |
|
Supervisión sintética |
|
Supervisión de entornos de virtualización |
|
Supervisión del sistema operativo Windows |
