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. Introduzione
A questo punto, partiamo dal presupposto che tu abbia già familiarizzato con le nozioni di base relative ai programmi di origine dati e agli agenti speciali e che ne comprenda i meccanismi fondamentali. Gli agenti speciali aggiungono una semplice configurabilità a un programma di origine dati. A tal fine vengono utilizzate le regole presenti nella configurazione. La configurabilità può influire sia sull'ambito e sul tipo di dati recuperati, sia sulla loro pre-elaborazione prima che vengano trasferiti come output dell'agente alla catena di elaborazione successiva.
Ogni agente speciale è un programma eseguibile in modo indipendente senza dipendenze dalle interfacce di programmazione di Checkmk. Come per i programmi sorgente dati, anche gli agenti speciali vengono chiamati all’intervallo di controllo abituale (di solito un minuto per impostazione predefinita). L'agente speciale avvia un processo e l'output dell'agente viene trasferito all'output standard. L'agente speciale quindi termina. Questo ti permette di implementare agenti speciali in qualsiasi linguaggio di programmazione. Tuttavia, i processi di breve durata rendono i linguaggi compilati just-in-time come Java meno adatti rispetto ai linguaggi compilati o ai linguaggi interpretati ad avvio rapido.
I processi attivati vengono configurati tramite parametri della riga di comando quando viene richiamato l'agente speciale. Per farlo, devi determinare come gli elementi della GUI, come i campi di immissione testo o le caselle di controllo, debbano essere mappati a parametri specifici.
Gli esempi di codice creati per questo articolo sono disponibili nel nostro repository GitHub e l'agente speciale Open-Meteo finito è disponibile come MKP nell'Exchange di Checkmk.
2. Creazione di un agente speciale "minimo"
Quando sviluppi agenti speciali, devi anche assicurarti di utilizzare l'utente del sito corrispondente per la creazione del file. Se i proprietari o i permessi non sono definiti correttamente, ciò può causare problemi e incompatibilità. |
A differenza del programma di origine dati, un agente speciale non può trovarsi in qualsiasi punto del file system.
Ha una posizione specifica nella gerarchia delle directory di Checkmk.
Inoltre, il nome del file deve iniziare con agent_.
Inoltre, gli agenti speciali devono sempre essere resi noti al sito Checkmk.
Un agente speciale minimale ed eseguibile richiede quindi almeno tre file: l'agente speciale, la configurazione delle regole e la configurazione delle chiamate.
2.1. Preparazione dell'ambiente
Come passo preparatorio, dovresti quindi creare tre directory, tutte situate sotto ~/local/lib/python3/cmk_addons/plugins/<plug-in_family>.
La quarta directory mostrata nell'esempio qui sotto è facoltativa — può essere utilizzata per un controllo basato su agente.
2.2. L'agente speciale
Cosa potrebbe esserci di meglio come agente speciale minimale di un controllo locale che fornisce un servizio "Hello World!"? Anche un semplice script di shell che genera due righe di output può farlo:
Questo script non deve avere un'estensione di file. |
Non dimenticare: il file deve essere reso eseguibile:
Questo assegnerà i permessi necessari:
per il proprietario del file (lettura, scrittura, esecuzione)
per il gruppo associato al file (lettura, esecuzione)
per gli altri utenti (lettura, esecuzione).
2.3. Configurazione della regola
Ora è stata creata una regola minima indispensabile:
Titolo e categoria sono definiti.
Il modulo GUI per la configurazione rimane vuoto.
L'namee si riferisce al nome dell'agente speciale, a cui viene assegnato il prefisso agent_.
Un agente configurato in questo modo sarà disponibile in Other integrations.
Tuttavia, il suo modello di configurazione non contiene voci a causa dell'elements={} vuoto.
2.4. La configurazione della chiamata
Questa configurazione combina l'agente speciale da eseguire con le impostazioni ottenute dalla GUI e le impostazioni predefinite.
Queste impostazioni diventano ora parametri di chiamata.
L'name si riferisce nuovamente al nome dell'agente speciale, a cui viene assegnato il prefisso agent_.
Questo fornisce i requisiti di base per l'agente speciale. Ovviamente puoi aggiungere ulteriori informazioni in qualsiasi momento.
2.5. Il primo test
Una volta creati i file, verifica innanzitutto se Checkmk è in grado di convalidarli:
Successivamente, riavvia il server web del sito:
Se vuoi che la nuova regola sia immediatamente visibile nella ricerca, dovrai riavviare il database in memoria Redis:
Se ora apri Setup > Agents > Other integrations, dovresti vedere la nuova voce Hello special! nella sezione Custom integrations.
Se questa voce manca, verifica innanzitutto di aver salvato tutti i file nella posizione indicata. Se stai cercando altre possibili cause di errore, nelle edizioni commerciali puoi farlo comodamente tramite l'amministrazione dei pacchetti di estensione Checkmk. In alternativa, abbiamo elencato le cause di errore più importanti e le possibili soluzioni nel capitolo Risoluzione dei problemi.
3. Un esempio più complesso: un servizio meteo completo
Un controllo che non cambia mai stato è, beh, piuttosto prevedibile. Quindi oseremo fare il passo verso un "vero" agente speciale che interroga un'API web o REST e riceve in risposta un oggetto sotto forma di struttura JSON o XML. Questi sono anche formati di dati tipici quando si accede alle API di dispositivi di rete come i dispositivi SAN.
Per non aver bisogno di hardware specifico per questo esercizio, useremo l'API gratuita di Open-Meteo.com.
Il nostro obiettivo è scrivere un agente speciale completo configurato con latitudine e longitudine.
Per mantenere l'esercizio semplice, l'agente speciale interpreterà anche i dati direttamente.
Ad esempio, l'agente speciale dovrebbe assumere lo stato "WARN" per temperature inferiori a 5 gradi Celsius e lo stato "CRIT" per temperature inferiori a 0 gradi.
Abbreviamo il nostro controllo in ometemp, l'agente speciale in agent_ometemp e così via.
Open-Meteo consente l'uso gratuito per scopi non commerciali e si riserva il diritto di bloccare gli indirizzi IP in caso di richieste eccessive. L'interrogazione minuto per minuto dell'API rientra ancora nei limiti tollerabili. Tuttavia, non dovresti abusare del servizio e dovresti eliminare le regole degli agenti speciali che utilizzano questo servizio dopo aver completato con successo i test. Presta particolare attenzione ad assicurarti che le regole di assegnazione degli agenti speciali create per il test si applichino solo a un host e non a decine o centinaia! |
3.1. Preparazione dell'ambiente
Come nell'esercizio precedente, crea prima le directory necessarie — questa volta con il nome ometemp invece di hellospecial.
3.2. L'agente speciale
Ora che si devono elaborare dati reali, dovrai anche riflettere, ad esempio, sul linguaggio di programmazione e sulla pre-elaborazione.
Il nostro esercizio interroga un’API pubblica e riceve dati JSON.
Questo potrebbe essere fatto nella shell con un comando curl.
Tuttavia, dato che Checkmk è dotato di un Python ben equipaggiato, ha senso utilizzarlo.
La decisione successiva riguarda l'elaborazione dei dati. Ad esempio, puoi semplicemente passare i dati JSON all'output dell'agente o convertirli in un formato tabellare nell'agente speciale. In pratica, di solito deciderai questo in base al tuo ambiente di lavoro: È stata presa in considerazione la "divisione dei compiti" durante lo sviluppo del tuo check? I dati preparati semplificano lo sviluppo del relativo plug-in di check basato sull'agente? O addirittura lo rendono superfluo? Quest'ultimo è il caso se i dati possono essere preparati in modo tale da poter essere analizzati con un plug-in di check esistente.
Il nostro esempio si limita a inoltrare la risposta JSON.
L'analisi avviene poi nel plug-in di controllo basato su agente.
La longitudine e la latitudine vengono inserite utilizzando gli argomenti della riga di comando --latitude e --longitude.
Per poter leggere meglio gli argomenti della riga di comando, utilizziamo la libreria argparse.
Poiché Open-Meteo supporta la latitudine e la longitudine codificate nell'URL, è sufficiente un URL con segnaposto.
Prova questo URL nel browser con la tua latitudine e longitudine.
Promemoria: questo script non deve avere un'estensione di file. |
La sezione dell'agente ometemp conterrà solo l'oggetto JSON ricevuto.
Prova l'agente speciale richiamandolo dalla riga di comando.
L'output sulla riga di comando dovrebbe ora apparire simile a questo:
<<<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 configurazione delle regole
Il passo successivo è la configurazione delle regole per l'agente. Una volta completata, questa regola verrà visualizzata in Setup > Agents > Other integrations nel gruppo "Environmental".
Le intestazioni del raggruppamento in Setup > Agents > Other integrations saranno rese visibili dinamicamente. Ciò significa che sarà possibile vedere il raggruppamento Environmental solo una volta che sarà disponibile il primo agente speciale inserito in esso. Una panoramica — non esaustiva — dei raggruppamenti utilizzabili è disponibile nella sezione File e directory alla fine di questo articolo. |
Con questo, è stato creato anche l'agente speciale.
Dopo aver verificato con cmk-validate-plugins, riavvia il server web del sito:
Ora è possibile creare una regola basata su questo agente speciale con Add rule: Open-Meteo temperature. Questa regola però non servirà a molto per ora, dato che al momento contiene solo i due campi per inserire la longitudine e la latitudine.
Estensione: Utilizzo delle password
In molti casi, per accedere ai dati sono necessari un nome utente e una password o una chiave API.
Per la gestione delle password sono disponibili elementi separati di "formspec".
Questi ti consentono di definire password ad hoc o di accedere all'archivio delle password.
In questo esempio, a tale scopo è possibile utilizzare la seguente estensione dello script creato in precedenza.
Estendi la prima riga con le variabili aggiuntive e inserisci le nuove sezioni di programma:
Non dimenticare di riavviare il server web del sito dopo aver modificato (in questo caso esteso) uno script.
Poiché l'esempio con Open-Meteo non richiede una password, qui mostriamo la gestione di base delle password, ma non le includiamo nella chiamata API.
3.4. La configurazione della chiamata
Successivamente, estendiamo il nuovo agente speciale in modo che non solo contenga la longitudine e la latitudine, ma le elabori anche. Il nostro obiettivo finale è ottenere i valori di temperatura attuali per la nostra posizione. La seguente configurazione combina quindi l'agente speciale da eseguire con le impostazioni ottenute dalla GUI — cioè dalla nostra sezione delle regole esistente — e le impostazioni degli standard.
I valori di longitudine e latitudine, che di solito puoi specificare, vengono ora trasferiti al dizionario denominato params.
Allo stesso tempo, l’oggetto host_config contiene tutte le impostazioni specifiche dell’host da utilizzare in questo caso.
Ad esempio, host_config.primary_ip_config.address ti dà accesso all’indirizzo IP primario, mentre host_config.name contiene il nome host.
Quando si trasferisce all'agente speciale, tieni presente che la chiamata viene effettuata tramite una shell.
L'elenco dei parametri di chiamata può quindi contenere solo stringhe.
Le impostazioni diventano quindi parametri di chiamata che finiscono nell'elenco command_arguments.
Utilizzo delle password
L'esempio qui riportato passa le password in chiaro come argomenti della riga di comando.
Senza ulteriori misure di sicurezza, queste password potrebbero essere lette, ad esempio, dalla tabella dei processi.
Questa vulnerabilità può essere minimizzata modificando la voce nella tabella dei processi all'avvio del programma.
In Python, ad esempio, questo può essere fatto con il modulo |
Poiché le password sono memorizzate come oggetto, l'accesso avviene tramite la funzione unsafe() di quell'oggetto:
3.5. Il plug-in di controllo
Per completezza, mostriamo qui anche il plug-in di controllo basato su agente. Lo sviluppo di questi plug-in è descritto in dettaglio nell'articolo sui plug-in di controllo basati su agente.
Una differenza rispetto all'esempio citato nell'articolo è il trasferimento del JSON restituito dall'API REST:
Il plug-in di controllo riceve sempre la sezione dell'agente come un elenco bidimensionale ("elenco di elenchi") di stringhe.
Per prima cosa, usiamo l'itertools per trasformare questa lista bidimensionale in una unidimensionale.
Poi concateniamo l'array risultante con degli spazi, il che converte l'intera sezione dell'agente in una singola stringa.
Infine, ci assicuriamo di sostituire le virgolette singole con quelle doppie per poter caricare la stringa direttamente come oggetto con l'json.loads().
3.6. Test finale
È sempre una buona idea eseguire una convalida con cmk-validate-plugins se hai apportato modifiche agli elementi che vengono eseguiti all'interno dei processi di Checkmk.
In questo articolo, questi includono regole, configurazione delle chiamate e plugin di controllo.
Se hai apportato modifiche solo alla configurazione delle chiamate e all'agente speciale stesso, è sufficiente generare una nuova configurazione per il core di monitoraggio e riavviarlo. Questo si fa con il comando:
Se hai modificato anche le regole o i plug-in di controllo, genera prima la configurazione per il core di monitoraggio e poi riavvia l'intero sito:
Gli script descritti in questo articolo per l'agente speciale, la configurazione delle regole e la configurazione delle chiamate, se utilizzati in combinazione con questo plug-in di controllo, dovrebbero ora fornirti un servizio funzionante in Checkmk:

4. Risoluzione dei problemi
Anche quando sviluppi i tuoi agenti speciali, possono (purtroppo) verificarsi errori e problemi.
Identificare la causa di un errore è importante tanto quanto risolverlo.
Per avere un'idea iniziale delle possibili cause, dovresti prima eseguire cmk-validate-config.
Le sezioni seguenti ti aiuteranno a isolare ulteriormente la fonte del problema.
4.1. Avvisi nella panoramica dei servizi dell'host
Se il servizio Check_MK cambia improvvisamente il suo stato in WARN o CRIT dopo l'attivazione del suo agente speciale, dai un'occhiata alla relativa Summary.

Se l'Summarye indica una connessione con il nuovo agente speciale, controlla le proprietà dell'host. Per il parametro Checkmk agent / API integrations deve essere selezionato il valore Configured API integrations and Checkmk agent.

4.2. La regola è scomparsa o viene visualizzato un avviso
Se il tuo agente speciale non viene (più) visualizzato in Checkmk sotto Setup > Agents > Other integrations, potrebbe esserci un errore nella configurazione della regola (rulesets/special_agent.py).
Se stai utilizzando una delle edizioni commerciali, potresti invece vedere un avviso rosso quando provi a modificare la regola o a crearne una nuova.
Segui il link alla pagina del rapporto di errore.
Lì verrà visualizzata la possibile causa del problema.
Quindi visualizza le descrizioni degli errori:
Ad esempio, riceverai un output simile a questo:
2024-12-17 10:15:51,742 [40] [cmk.web 2669118] Error converting to legacy rulespec 'ometemp' : name 'migrate_to_password' is not definedControlla la sintassi del tuo file rulesets/special_agent.py.
Verifica che tutte le librerie necessarie siano state prese in considerazione e che tutte le variabili siano state importate.
Controlla che tutte le indentazioni siano corrette e verifica l'intera sintassi.
Se la tua regola era precedentemente visibile in Checkmk e, a seguito di una modifica alla configurazione della regola, è improvvisamente scomparsa, te ne accorgerai solo se desideri adattare regole esistenti o crearne di nuove. Il problema non influirà sul monitoraggio dei servizi esistenti. |
4.3. Messaggi di errore durante l'attivazione delle modifiche
Potrebbe esserci anche un problema nella configurazione della chiamata o nell'agente speciale stesso. Questo diventa visibile, ad esempio, perché durante l'Activate changes viene visualizzato un avviso giallo.
Controlla il file server_side_calls/special_agent.py seguendo le indicazioni del messaggio di errore.
Se questo non risolve l'errore, puoi cercare nuovamente i messaggi di errore dalla riga di comando:
Dopo un attimo di attesa, riceverai un output simile al seguente (qui abbreviato per chiarezza):
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'Le ultime righe dell'output sono particolarmente interessanti:
Nel file server_side_calls/special_agent.py si sta tentando di accedere a un elemento del dizionario params che non esiste.
4.4. Verifica dell'output dell'agente
Un'altra causa di errore potrebbe essere che il plug-in di controllo non stia generando alcun dato. Questo può essere verificato anche dalla riga di comando:
Se qui ricevi un messaggio di errore invece di una stringa con i dati di misurazione attuali, usa il messaggio di errore per correggere il problema.
5. File e directory
5.1. Cartelle
| Percorso del file | Descrizione |
|---|---|
|
Directory di base per l'archiviazione dei file dei plug-in. |
|
Posizione di archiviazione dei file eseguibili. |
|
Percorso di archiviazione dei file dei set di regole. |
|
Percorso di archiviazione dei file di configurazione delle chiamate. |
|
Percorso di archiviazione per i plug-in di controllo basati su agenti. |
|
Qui vengono installati gli agenti speciali standard. |
|
Archiviazione degli agenti speciali che hai modificato. |
|
Archiviazione dei tuoi programmi o script che devono trovarsi nel percorso di ricerca e che possono essere eseguiti direttamente senza specificare un percorso file. Se un programma si trova sia in |
5.2. Raggruppamenti disponibili inOther integrations
| Nome | Descrizione |
|---|---|
|
Monitoraggio delle applicazioni |
|
Monitoraggio cloud |
|
Monitoraggio dei sistemi di gestione della configurazione |
|
Monitoraggio dei database |
|
Tutto ciò che non rientra in altre categorie |
|
Monitoraggio dell'ambiente e delle aree circostanti |
|
Monitoraggio del sistema operativo Linux |
|
Monitoraggio della rete |
|
Monitoraggio del middleware |
|
Monitoraggio dei sistemi di notifica |
|
Monitoraggio del sistema operativo in generale |
|
Monitoraggio delle periferiche |
|
Monitoraggio dell'alimentazione |
|
Monitoraggio dell'hardware del server |
|
Monitoraggio dei sistemi di archiviazione |
|
Monitoraggio sintetico |
|
Monitoraggio degli ambienti di virtualizzazione |
|
Monitoraggio del sistema operativo Windows |
