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

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»

Tip

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.

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellospecial/libexec
OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellospecial/rulesets
OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellospecial/server_side_calls
OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellospecial/agent_based
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

~/local/lib/python3/cmk_addons/plugins/hellospecial/libexec/agent_hellospecial
#!/bin/bash
echo '<<<local>>>'
echo '0 "Hello special" - This static service is always OK'
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!
Tip

Este script no debe tener extensión de archivo.

No te olvides: el archivo debe ser ejecutable:

OMD[mysite]:~$ chmod 755 local/lib/python3/cmk_addons/plugins/hellospecial/libexec/agent_hellospecial
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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.

~/local/lib/python3/cmk_addons/plugins/hellospecial/rulesets/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.rulesets.v1.form_specs import Dictionary
from cmk.rulesets.v1.rule_specs import SpecialAgent, Topic, Help, Title

def _formspec():
    return Dictionary(
        title=Title("Hello special!"),
        help_text=Help("This rule is to demonstrate the minimum special agent."),
        elements={}
    )

rule_spec_hellospecial = SpecialAgent(
    topic=Topic.GENERAL,
    name="hellospecial",
    title=Title("Hello special!"),
    parameter_form=_formspec
)
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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

~/local/lib/python3/cmk_addons/plugins/hellospecial/server_side_calls/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.server_side_calls.v1 import noop_parser, SpecialAgentConfig, SpecialAgentCommand

def _agent_arguments(params, host_config):
    yield SpecialAgentCommand(command_arguments=[])

special_agent_hellospecial = SpecialAgentConfig(
    name="hellospecial",
    parameter_parser=noop_parser,
    commands_function=_agent_arguments
)
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

OMD[mysite]:~$ cmk-validate-plugins
Agent based plugins loading succeeded, Active checks loading succeeded, Special agents
loading succeeded, Rule specs loading succeeded, Rule specs forms creation succeeded,
Referenced rule specs validation succeeded, Loaded rule specs usage succeeded
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

A continuación, reinicia el servidor web del sitio:

OMD[mysite]:~$ omd restart apache
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

OMD[mysite]:~$ omd restart redis
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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.

Tip

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.

~/local/lib/python3/cmk_addons/plugins/ometemp/libexec/agent_ometemp
#!/usr/bin/env python3
# Shebang needed this time to find the interpreter!

import requests
import argparse

url = "https://api.open-meteo.com/v1/forecast?latitude={lat:.4f}&longitude={long:.4f}&current=temperature_2m"

parser = argparse.ArgumentParser("agent_ometemp")
parser.add_argument(
    "--latitude",
    help="Specify the latitude in degrees (decimal notation).",
    type=float,
    default=0.0)
parser.add_argument(
    "--longitude",
    help="Specify the longitude in degrees (decimal notation).",
    type=float,
    default=0.0)
args = parser.parse_args()

# print(url.format(lat=args.latitude, long=args.longitude))
response = requests.get(url.format(lat=args.latitude, long=args.longitude))
print('<<<ometemp:sep(0)>>>')
print(response.json())
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!
Tip

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.

OMD[mysite]:~$ ~/local/lib/python3/cmk_addons/plugins/ometemp/libexec/agent_ometemp --latitude 48.1305 --longitude 11.5953
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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».

Tip

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.

~/local/lib/python3/cmk_addons/plugins/ometemp/rulesets/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.rulesets.v1.form_specs import Dictionary, DictElement, Float
from cmk.rulesets.v1.rule_specs import SpecialAgent, Topic, Help, Title

def _formspec():
    return Dictionary(
        title=Title("Open-Meteo temperature"),
        help_text=Help("This rule is used to showcase a special agent with configuration."),
        elements={
            "latitude": DictElement(
                required=True,
                parameter_form=Float(
                    title=Title("Latitude in degrees (decimal notation)"),
                ),
            ),
            "longitude": DictElement(
                required=True,
                parameter_form=Float(
                    title=Title("Longitude in degrees (decimal notation)"),
                ),
            ),
        }
    )

rule_spec_ometemp = SpecialAgent(
    topic=Topic.ENVIRONMENTAL,
    name="ometemp",
    title=Title("Open-Meteo temperature"),
    parameter_form=_formspec
)
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Con esto, también se ha creado el agente especial. Después de comprobarlo en cmk-validate-plugins, reinicia el servidor web del sitio:

OMD[mysite]:~$ omd restart apache
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

from cmk.rulesets.v1.form_specs import Dictionary, DictElement, Float, String, Password, migrate_to_password

def _formspec():
    return Dictionary(
        # ...
        elements={
            # ...
            "user": DictElement(
                required=True,
                parameter_form=String(
                    title=Title("User ID for login"),
                    prefill=DefaultValue("monitoring"),
                ),
            ),
            "password": DictElement(
                required=True,
                parameter_form=Password(
                    title=Title("Password for this user"),
                    migrate=migrate_to_password,
                ),
            ),
        }
    )
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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.

~/local/lib/python3/cmk_addons/plugins/ometemp/server_side_calls/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.server_side_calls.v1 import noop_parser, SpecialAgentConfig, SpecialAgentCommand

def _agent_arguments(params, host_config):
    args = [ "--latitude", str(params['latitude']), "--longitude", str(params['longitude']) ]
    yield SpecialAgentCommand(command_arguments=args)

special_agent_ometemp = SpecialAgentConfig(
    name="ometemp",
    parameter_parser=noop_parser,
    commands_function=_agent_arguments
)
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

Uso de contraseñas

Important

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 `setproctitle`. Actualmente estamos preparando una forma aún más segura en la que el programa iniciado lea la contraseña directamente desde el almacén de contraseñas.

Como las contraseñas se almacenan como un objeto, el acceso se realiza a través de la función `unsafe()` de ese objeto:

def _agent_arguments(params, host_config):
    args = [
        "--latitude", str(params['latitude']),
        "--longitude", str(params['longitude']),
        "--user", params['user'],
        "--password", params['password'].unsafe()
    ]
    yield SpecialAgentCommand(command_arguments=args)
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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()`.

~/local/lib/python3/cmk_addons/plugins/ometemp/agent_based/ometemp.py
#!/usr/bin/env python3

from cmk.agent_based.v2 import AgentSection, CheckPlugin, Service, Result, State, Metric, check_levels
import itertools
import json

def parse_ometemp(string_table):
    flatlist = list(itertools.chain.from_iterable(string_table))
    parsed = json.loads(" ".join(flatlist).replace("'", "\""))
    return parsed

def discover_ometemp(section):
    yield Service()

def check_ometemp(section):
    t = section['current']['temperature_2m']
    if t < 0.0:
        yield Result(state=State.CRIT, summary="Brrrrrr!")
    elif t < 5.0:
        yield Result(state=State.WARN, summary="It's getting cold...")
    else:
        yield Result(state=State.OK, summary="Nice here.")
    return

agent_section_ometemp = AgentSection(
    name = "ometemp",
    parse_function = parse_ometemp,
)

check_plugin_ometemp = CheckPlugin(
    name = "ometemp",
    service_name = "Open Meteo temperature (2m)",
    discovery_function = discover_ometemp,
    check_function = check_ometemp,
)
Copiar el contenido del archivo al portapapeles
¡Contenido del archivo copiado correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

OMD[mysite]:~$ cmk -R
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

OMD[mysite]:~$ cmk -U
OMD[mysite]:~$ omd restart
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

View of services including ometemp.

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.

Error message from the Check_MK service related to its special agent.

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.

Selection of ‘Configured API integrations and Checkmk agent’.

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

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

OMD[mysite]:~$ tail -f var/log/web.log
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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 defined

Comprueba 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.

Tip

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:

OMD[mysite]:~$ cmk -d localhost --debug | less
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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:

OMD[mysite]:~$ cmk -d localhost --debug | less
Copiar comando(s) al portapapeles
¡Comandos copiados correctamente al portapapeles!
¡Se ha denegado el acceso de escritura al portapapeles!

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

~/local/lib/python3/cmk_addons/plugins/

Directorio base para guardar los archivos de los complementos.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/libexec/

Ubicación de almacenamiento de los archivos ejecutables.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/rulesets/

Ubicación de almacenamiento de los archivos de conjuntos de reglas.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/server_side_calls/

Ubicación de almacenamiento de los archivos de configuración de llamadas.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/agent_based/

Ubicación de almacenamiento para los complementos de comprobación basados en agentes.

~/share/check_mk/agents/special/

Los agentes especiales estándar se instalan aquí.

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

Almacenamiento de los agentes especiales que hayas modificado.

~/local/bin/

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

5.2. Agrupaciones disponibles enOther integrations

Nombre Descripción

APPLICATIONS

Supervisión de aplicaciones

CLOUD

Supervisión de la nube

CONFIGURATION_DEPLOYMENT

Supervisión de sistemas de gestión de la configuración

DATABASES

Supervisión de bases de datos

GENERAL

Todo lo que no encaja en ninguna otra categoría

ENVIRONMENTAL

Supervisión del entorno y las instalaciones

LINUX

Supervisión del sistema operativo Linux

NETWORKING

Supervisión de la red

MIDDLEWARE

Supervisión del middleware

NOTIFICATIONS

Supervisión de los sistemas de notificación

OPERATING_SYSTEM

Supervisión del sistema operativo en general

PERIPHERALS

Supervisión de dispositivos periféricos

POWER

Supervisión de la fuente de alimentación

SERVER_HARDWARE

Supervisión del hardware del servidor

STORAGE

Supervisión de los sistemas de almacenamiento

SYNTHETIC_MONITORING

Supervisión sintética

VIRTUALIZATION

Supervisión de entornos de virtualización

WINDOWS

Supervisión del sistema operativo Windows


Last modified: Wed, 01 Apr 2026 14:27:49 GMT via commit abaa3aa20
En esta página