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
I plug-in di controllo compatibili con SNMP sono sviluppati in modo simile ai loro omologhi basati su agente. La differenza sta sia nel processo di individuazione dei servizi che nel controllo stesso. Con i plug-in di controllo basati su agente, il plug-in agente viene utilizzato per determinare quali dati vengono inviati al sito Checkmk, e spesso il pre-filtraggio (ma non la valutazione) avviene già sull'host. Al contrario, con SNMP devi specificare esattamente quali campi di dati ti servono e richiederli in modo esplicito. Con SNMP, queste aree (rami di un albero) o singoli campi di dati (foglie) sono identificati dagli OID (identificatori di oggetto).
In teoria sarebbe possibile un trasferimento completo di tutti i dati (utilizzando il cosiddetto SNMP walk), tuttavia, anche con dispositivi veloci ciò richiede alcuni minuti e, con switch complessi, può richiedere più di un'ora. Questo rappresenta quindi già un problema durante la scoperta e lo è ancora di più durante il controllo stesso. In questo caso Checkmk adotta un approccio più mirato. Ciononostante, gli SNMP walk sono disponibili in Checkmk per il debug dei controlli esistenti e lo sviluppo di controlli personalizzati.
Se non hai ancora esperienza con SNMP, ti consigliamo di leggere l'articolo sul monitoraggio tramite SNMP.
1.1. Cosa funziona in modo diverso con SNMP?
Rispetto a un plug-in di controllo per l'agente Checkmk, ci sono alcune caratteristiche particolari da tenere in considerazione con SNMP. Con un plug-in di controllo per SNMP, la scoperta dei servizi è suddivisa in due fasi.
Come primo passo, la funzione di rilevamento SNMP viene utilizzata per individuare il dispositivo.
Questo serve a determinare se il plug-in di controllo è di qualche interesse per il dispositivo in questione e viene eseguito per ogni dispositivo monitorato tramite SNMP.
A questo scopo vengono recuperati alcuni OID — singoli, senza uno SNMP walk.
Il più importante di questi è l’sysDescr (OID: 1.3.6.1.2.1.1.1.0).
Sotto questo OID, ogni dispositivo SNMP fornisce una descrizione di sé stesso, ad esempio Flintstones, Inc. Fred Router rev23.
Nella seconda fase, vengono recuperati i dati di monitoraggio necessari per ciascuno di questi candidati utilizzando gli SNMP walk.
Questi vengono poi riassunti in una tabella e forniti alla funzione di rilevamento del plug-in di controllo nell’argomento section, che determina quindi gli elementi da monitorare.
Viene quindi generato un servizio per ciascuno di questi elementi.
Durante il controllo si sa già se il plug-in deve essere eseguito per il dispositivo e quindi non è necessario un nuovo rilevamento SNMP. I dati di monitoraggio attuali richiesti per il plug-in vengono recuperati qui tramite SNMP walk.
Cosa devi fare di diverso con un plug-in di controllo per SNMP rispetto a uno basato su agente?
Non hai bisogno di un plug-in agente.
Si definiscono gli OID necessari per il rilevamento SNMP e i testi che devono contenere.
Decidi quali rami e foglie dell'albero SNMP devono essere recuperati per il monitoraggio.
1.2. Non aver paura delle MIB!
In questa breve introduzione vorremmo parlare dei famigerati MIB SNMP, sui quali esistono molti pregiudizi. La buona notizia: Checkmk non ha bisogno dei MIB! Tuttavia, possono essere un aiuto importante quando si sviluppa un plug-in di controllo o si risolvono i problemi di quelli esistenti.
Cosa sono le MIB? MIB significa letteralmente Management Information Base, che contiene poche informazioni in più rispetto alla stessa abbreviazione. Fondamentalmente, una MIB è un file di testo leggibile dall'uomo che descrive i rami e le foglie in un albero di dati SNMP.
Gli OID possono identificare rami o foglie. La descrizione del ramo contiene informazioni sul sistema e sul sottosistema fornite dal ramo stesso. Se un OID fa riferimento a una foglia, le informazioni nel MIB contengono dettagli sul tipo di dati (stringa di caratteri, numero a virgola fissa, stringa esadecimale, …), l’intervallo di valori e la rappresentazione. Ad esempio, le temperature possono essere memorizzate come numero a virgola fissa con segno sulla scala Celsius con una risoluzione di 0,1° o senza segno con incrementi di 1,0° sulla scala Kelvin.
Checkmk fornisce una serie di file MIB liberamente accessibili. Questi descrivono campi molto generici nell'albero OID globale, ma non contengono campi specifici del produttore. Non sono quindi di grande aiuto per i plug-in di controllo sviluppati autonomamente.
Cerca quindi i file MIB rilevanti per il tuo dispositivo specifico sul sito web del produttore o anche nell’interfaccia di gestione del dispositivo.
Installa questi file nel sito Checkmk nella directory ~/local/share/snmp/mibs/.
Potrai quindi tradurre i numeri OID in nomi utilizzando gli SNMP walk e trovare così più rapidamente i dati di interesse ai fini del monitoraggio.
Come già accennato, le MIB ben curate contengono anche informazioni interessanti nei loro commenti.
Puoi visualizzare facilmente un file MIB con un editor di testo o con il pager less.
2. Individuare gli OID corretti
Il prerequisito fondamentale per sviluppare un plug-in di controllo basato su SNMP è sapere quali OID contengono le informazioni rilevanti. Per lo scenario di esempio presentato, abbiamo ipotizzato che tu abbia appena messo in servizio un lotto di router del tipo Flintstones, Inc. Fred Router rev23. Ti capiterà spesso di imbatterti in questo dispositivo fittizio nella documentazione del produttore e nei commenti MIB. Tuttavia, hai dimenticato di inserire le informazioni di contatto e di ubicazione per alcuni dispositivi. Un plug-in di controllo scritto da te per Checkmk dovrebbe ora aiutarti a identificare questi dispositivi.
Il plug-in di esempio che abbiamo preparato è scritto in modo tale da poter essere eseguito con quasi tutti i dispositivi compatibili con SNMP. Devi solo adattare la stringa di caratteri da confrontare. Se non hai un dispositivo a portata di mano, troverai varie opzioni di simulazione nel capitolo dedicato alla risoluzione dei problemi. |
Il primo passo è eseguire un SNMP walk completo. Ciò comporta il recupero di tutti i dati disponibili tramite SNMP. Con Checkmk puoi farlo molto facilmente. Per prima cosa includi nel monitoraggio il dispositivo per il quale vuoi sviluppare un plug-in di controllo. Assicurati che possa essere monitorato nelle funzioni di base. Come minimo, devono essere individuati i servizi SNMP Info e Uptime e probabilmente anche almeno un Interface. Questo garantirà che l'accesso SNMP funzioni correttamente.
Passa quindi alla riga di comando del sito Checkmk.
Qui puoi eseguire un walk completo con il seguente comando — nell'esempio seguente per il dispositivo con il nome host mydevice01.
Ti consigliamo di utilizzare anche l'opzione -v (per la modalità verbosa):
Come già accennato, un walk SNMP completo può richiedere minuti o addirittura ore (anche se quest’ultimo caso è piuttosto raro), quindi non preoccuparti se ci vuole un po’ di tempo per completarlo.
I risultati del walk vengono salvati nel file ~/var/check_mk/snmpwalks/mydevice01.
Si tratta di un file di testo di facile lettura che inizia così:
.1.3.6.1.2.1.1.1.0 Flintstones, Inc. Fred Router rev23
.1.3.6.1.2.1.1.2.0 .1.3.6.1.4.1.424242.2.3
.1.3.6.1.2.1.1.3.0 546522419
.1.3.6.1.2.1.1.4.0 barney@example.com
.1.3.6.1.2.1.1.5.0 big-router-01
.1.3.6.1.2.1.1.6.0 Server room 23, Stonestreet 52, Munich
.1.3.6.1.2.1.1.7.0 72
.1.3.6.1.2.1.1.8.0 0Ogni riga contiene un OID e il relativo valore.
Troverai quello più importante nella primissima riga, ovvero sysDescr.
Questo dovrebbe essere un identificatore univoco per un modello hardware.
Anche la seconda riga è interessante:
Sotto 1.3.6.1.4.1 ci sono dei rami che i produttori di hardware possono assegnarsi da soli; in questo caso Flintstones, Inc. ha l'ID produttore fittizio 424242.
Sotto questo, l'azienda ha assegnato 2 per i router e 3 per lo stesso modello.
All'interno di questo ramo troverai poi gli OID specifici per i dispositivi.
Questi OID non sono però molto significativi. Se sono installati i MIB corretti, puoi tradurli in nomi in un secondo momento. È meglio reindirizzare l'output del comando seguente, che altrimenti verrebbe visualizzato nel terminale, in un file:
Una volta che questo file è stato translated, si legge come il walk originale, ma mostra in più il nome dell'OID in ogni riga dopo l'-->e:
.1.3.6.1.2.1.1.1.0 Flintstones, Inc. Fred Router rev23 --> SNMPv2-MIB::sysDescr.0
.1.3.6.1.2.1.1.2.0 .1.3.6.1.4.1.424242.2.3 --> SNMPv2-MIB::sysObjectID.0
.1.3.6.1.2.1.1.3.0 546522419 --> DISMAN-EVENT-MIB::sysUpTimeInstance
.1.3.6.1.2.1.1.4.0 barney@example.com --> SNMPv2-MIB::sysContact.0
.1.3.6.1.2.1.1.5.0 big-router-01 --> SNMPv2-MIB::sysName.0
.1.3.6.1.2.1.1.6.0 Server room 23, Stonestreet 52, Munich --> SNMPv2-MIB::sysLocation.0
.1.3.6.1.2.1.1.7.0 42 --> SNMPv2-MIB::sysServices.0
.1.3.6.1.2.1.1.8.0 27 --> SNMPv2-MIB::sysORLastChange.0Nell'output sopra riportato, ad esempio, l'OID 1.3.6.1.2.1.1.4.0 ha il valore barney@example.com e il nome SNMPv2-MIB::sysContact.0.
Le informazioni aggiuntive che mostrano i nomi degli OID forniscono dati importanti per identificare gli OID di interesse.
Per l'esempio presentato, sono sufficienti gli OID da 1.3.6.1.2.1.1.4.0 a 1.3.6.1.2.1.1.6.0.
3. Scrivere un semplice plug-in di verifica
Hai completato il lavoro preparatorio: Ora hai un elenco degli OID che vuoi leggere e valutare. Il compito ora è usare queste note per insegnare a Checkmk quali servizi vengono generati e quando devono andare su WARN o CRIT. La programmazione di un plug-in di controllo in Python usato per questo ha molte analogie con un plug-in di controllo basato su agente. Dato che ci sono alcune sottigliezze da considerare, mostreremo la struttura completa con tutte le funzioni che vengono usate.
3.1. Preparazione del file
Per i tuoi plug-in di controllo troverai la directory di base già pronta nella gerarchia local della directory del sito.
Si tratta di ~/local/lib/python3/cmk_addons/plugins/.
La directory appartiene all'utente del sito ed è quindi scrivibile per te.
In questa directory, i plug-in sono organizzati in famiglie di plug-in, i cui nomi delle directory possono essere scelti liberamente.
Ad esempio, tutti i plug-in relativi ai dispositivi Cisco sono memorizzati nella cartella cisco — oppure tutti i plug-in relativi ai router del produttore Flintstones, Inc. sono memorizzati nella cartella flintstone.
In questa sottodirectory <plug-in_family> vengono poi create ulteriori sottodirectory con nomi predefiniti, a seconda delle diverse API, ad esempio agent_based per l’API Check dei plug-in basati su agente, inclusi i plug-in di controllo basati su SNMP.
Crea le due sottodirectory per il nuovo plug-in di controllo e poi passa a esse per lavorare:
Crea qui il file flintstone_setup_check.py per il plug-in di controllo.
La convenzione prevede che il nome del file rifletta il nome del plug-in di controllo così come definito quando il plug-in viene creato come istanza della classe CheckPlugin.
È obbligatorio che il file termini con .py, poiché a partire dalla versione 2.0.0 di Checkmk i plug-in di controllo sono sempre veri e propri moduli Python.
Un framework di base eseguibile (scaricabile da GitHub), che amplierai passo dopo passo di seguito, ha questo aspetto:
Per prima cosa dovrai importare le funzioni e le classi necessarie per i plug-in di controllo dai moduli Python.
Ti sconsigliamo di usare l'import *, che viene usato occasionalmente, poiché consuma memoria inutilmente e rende poco chiaro quali spazi dei nomi siano effettivamente disponibili.
Per il nostro esempio, importeremo solo ciò che sarà necessario o potrebbe essere utile nel resto di questo articolo:
Rispetto al plug-in di controllo basato su agente, spiccano le nuove funzioni e classi specifiche per SNMP: SNMPTree, SimpleSNMPSection e startswith.
Si spiega da sé SNMPTree, che è una classe per visualizzare gli alberi SNMP.
La classe SimpleSNMPSection viene utilizzata per creare una sezione SNMP.
La funzione startswith() confronta il contenuto di una foglia SNMP con una stringa di caratteri.
Ne parleremo più avanti.
3.2. Creazione della sezione SNMP
Dopo aver identificato gli OID corretti, è il momento di sviluppare effettivamente il plug-in di controllo. Quando crei la sezione SNMP, devi specificare due cose:
Identifichi i dispositivi per i quali deve essere eseguito il plug-in di controllo.
Nell'esempio seguente, questo viene fatto con la funzionestartswith(), che confronta una stringa di caratteri con l'inizio del contenuto di una foglia OID. Ulteriori opzioni di assegnazione sono mostrate di seguito.Dichiari quali rami o foglie OID devono essere recuperati per il monitoraggio.
Questo viene fatto con il costruttore della classeSNMPTree.
Estendi il file di esempio preparato in modo che il plug-in venga eseguito solo per un numero limitato di dispositivi, in questo caso i modelli Flintstones, Inc. Fred Router.
Vengono quindi recuperati gli OID relativi a contatto, nome del dispositivo e posizione per questi dispositivi.
Questi tre OID sono forniti da ciascun dispositivo.
Se vuoi testare l'esempio con dispositivi reali compatibili con SNMP, è quindi sufficiente personalizzare il nome del modello da riconoscere.
L'esempio contiene anche il parametro name, con cui viene identificata la sezione SNMP generata, e una funzione di analisi, di cui parleremo più avanti.
Il rilevamento SNMP
Usa il parametro detect per specificare le condizioni in cui deve essere eseguita la funzione di rilevamento.
Nel nostro esempio, questo avviene se il valore dell'OID 1.3.6.1.2.1.1.1.0 (cioè l'sysDescr) inizia con il testo Flintstones, Inc. Fred Router (senza distinzione tra maiuscole e minuscole).
Oltre a startswith, c'è tutta una serie di altre possibili funzioni per l'identificazione.
Esiste anche una forma negata di ciascuna, che inizia con not_.
Tieni presente che ogni funzione deve essere specificata separatamente nell'istruzione import.
| Attributo | Funzione | Negazione |
|---|---|---|
|
Il valore dell'OID corrisponde al testo |
|
|
Il valore dell'OID contiene il testo |
|
|
Il valore dell'OID inizia con il testo |
|
|
Il valore dell'OID termina con il testo |
|
|
Il valore dell'OID corrisponde all'espressione regolare |
|
|
L'OID è disponibile sul dispositivo. Il suo valore può essere vuoto. |
|
C'è anche la possibilità di collegare diversi attributi con all_of o any_of.
all_of Richiede diversi controlli riusciti per un riconoscimento positivo.
L'esempio seguente assegna il tuo plug-in di controllo a un dispositivo se il testo nell'sysDescr inizia con foo (o FOO o Foo) e
l'OID 1.3.6.1.2.1.1.2.0 contiene il testo .4.1.11863.:
Al contrario, any_of è soddisfatto se è stato soddisfatto anche solo uno dei criteri.
Ecco un esempio in cui sono consentiti valori diversi per l'sysDescr:
A proposito: hai familiarità con le espressioni regolari? Se sì, probabilmente potresti semplificare questo esempio e cavartela con una sola riga:
E un'altra nota importante: Gli OID che passi al rilevamento SNMP per un plug-in di controllo vengono recuperati da ogni dispositivo monitorato tramite SNMP. Questo è l'unico modo in cui Checkmk può determinare a quali dispositivi applicare il plug-in di controllo.
Dovresti quindi prestare molta attenzione quando utilizzi OID specifici del produttore.
Cerca di progettare il tuo rilevamento SNMP in modo da dare priorità al controllo dell'sysDescr (1.3.6.1.2.1.1.1.0) e dell'sysObjectID (1.3.6.1.2.1.1.2.0).
Se hai ancora bisogno di un OID diverso per un'identificazione esatta, usa all_of() e procedi come segue:
Controlla prima
sysDescrosysObjectID.Negli argomenti successivi, puoi quindi restringere ulteriormente il gruppo di dispositivi per i quali deve essere eseguito il tuo plug-in.
Questo funziona grazie al principio della valutazione pigra:
non appena uno dei controlli precedenti fallisce, non verranno eseguiti ulteriori controlli.
Nell'esempio sopra, l'OID 1.3.6.1.4.1.424242.2.3.37.0 viene recuperato solo dai dispositivi che hanno anche Flintstone nel loro sysDescr.
3.3. Scrivere la funzione di analisi
Come per i plug-in basati su agenti, anche la funzione di analisi nel plug-in di controllo basato su SNMP ha il compito di convertire i dati dell'agente ricevuti in una forma che possa essere elaborata facilmente e, soprattutto, con prestazioni elevate.
Anche qui ricevi i dati sotto forma di lista. Tuttavia, ci sono alcune sottigliezze da considerare, poiché fa differenza se stai interrogando foglie o rami. Come promemoria: nel nostro esempio sopra riportato, vengono richieste le foglie:
Se estendi temporaneamente la funzione parse con la funzione print(), puoi visualizzare i dati che Checkmk fornisce da questa query durante il test del plug-in di controllo:
Riceverai una lista annidata che contiene un solo elemento al primo livello, ovvero una lista dei valori recuperati:
Il risultato appare leggermente diverso se recuperi rami che contengono più foglie.
Supponiamo che il router possa essere dotato di un numero variabile di schede di rete, il cui nome, stato di connessione e velocità possono essere letti qui sotto 1.3.6.1.4.1.424242.2.3.23 …
… quindi l'elenco bidimensionale potrebbe apparire così:
Tutte le foglie disponibili sotto un OID vengono scritte in una colonna della tabella. Dovrebbe quindi essere ovvio che, ai fini della visualizzazione dei dati, è possibile interrogare solo gli OID corrispondenti.
L'ultimo esempio mostrato per il recupero dei rami OID fa anche parte del nostro SNMP walk disponibile su GitHub, che puoi utilizzare per le simulazioni. |
Ma torniamo ora all'esempio in cui vengono interrogate le foglie OID relative a contatto, nome del dispositivo e posizione: La seguente funzione di analisi copia semplicemente ogni elemento della lista interna in una coppia chiave-valore nel dizionario restituito:
Il risultato della funzione di analisi sarà quindi simile a questo:
3.4. Creazione del plug-in di controllo
Un plug-in di controllo viene creato esattamente come descritto nei plug-in di controllo basati su agente.
Dato che nella maggior parte dei casi interrogherai diversi rami SNMP e questo comporterà diverse sezioni SNMP, di solito è necessario il parametro `sections` con l'elenco delle sezioni da valutare:
3.5. Scrivere la funzione di rilevamento
Anche la funzione di rilevamento corrisponde all'esempio per i plug-in di controllo basati su agente.
Per i plug-in di controllo che generano un solo servizio per host, è sufficiente un unico `yield()`:
3.6. Scrivere la funzione di controllo
Nell'esempio, vogliamo verificare se le informazioni relative al contatto, al nome del dispositivo e alla posizione sono disponibili. È quindi sufficiente controllare quali campi sono vuoti nella funzione di controllo e impostare di conseguenza lo stato su "CRIT" (se manca qualcosa) o su "OK" (se tutto è disponibile):
Una volta creata la funzione di controllo, il plug-in di controllo sarà pronto per l'uso.
Abbiamo reso disponibile questo plug-in di controllo completo su GitHub.
3.7. Test e attivazione del plug-in di controllo
Il test e l'attivazione vengono eseguiti allo stesso modo di un plug-in di controllo basato su agente. Per prima cosa, assicurati che il tuo plug-in sia sintatticamente corretto:
Il passo successivo è il rilevamento del servizio del plug-in:
Come previsto, il rilevamento del servizio è andato a buon fine. Ora puoi testare il controllo contenuto nel plug-in di controllo:
Dopo aver riavviato il core di monitoraggio …
… il nuovo servizio sarà quindi visibile nel monitoraggio:

4. Risoluzione dei problemi
Poiché la risoluzione dei problemi nei plug-in di controllo basati su agenti si applica essenzialmente anche ai plug-in di controllo basati su SNMP, qui tratteremo solo le specifiche relative a SNMP.
4.1. Opzioni di simulazione
Utilizzo dei walk SNMP salvati in Checkmk
Nell'articolo sul monitoraggio tramite SNMP mostriamo in dettaglio come creare SNMP walk dalla GUI e come utilizzarli per la simulazione. Questo permette anche di sviluppare plug-in di controllo su sistemi di test che non possono accedere agli host SNMP per i quali stai sviluppando un plug-in. Nel nostro repository GitHub troverai un esempio di SNMP walk, che utilizziamo in questo articolo e che puoi usare per sviluppare e testare il plug-in di controllo.
Il daemon SNMP fittizio
Se vuoi assicurarti che specifici OID cambino in base l'uno all'altro, può essere utile programmare un daemon SNMP fittizio che fornisca dati coerenti.
Il modulo Python snmp-agent può essere d'aiuto nella programmazione di un daemon fittizio di questo tipo.
4.2. Hardware non cooperativo
Prima che un dispositivo possa essere monitorato con un nuovo plug-in di controllo basato su SNMP, deve prima essere monitorabile tramite SNMP. Puoi quindi trovare una panoramica dei problemi noti con le soluzioni suggerite nell'articolo sul monitoraggio tramite SNMP.
5. File e cartelle
| Percorso del file | Descrizione |
|---|---|
|
Directory di base per l'archiviazione dei file dei plug-in. |
|
Posizione di archiviazione per i plug-in di controllo scritti secondo l'API Check V2. |
|
Metti qui i file MIB SNMP che devono essere caricati automaticamente. |
