Il celebre check_http è probabilmente uno dei check attivi più importanti nei sistemi di monitoraggio che affondano le proprie radici in Nagios. Scritto dallo stesso Ethan Galstad circa 25 anni fa, questo controllo è stato nel tempo ampliato in molti modi, attraverso varie estensioni. Molte di queste hanno introdotto opzioni da riga di comando incompatibili, comportamenti talvolta imprevedibili e persino violazioni – accidentali o intenzionali – degli standard.

Invece di correggere il vecchio check_http, Checkmk ha deciso di sviluppare un’alternativa moderna scritta in Rust. Quando abbiamo iniziato a lavorare al nuovo check, ci siamo resi conto fin da subito che non sarebbe stato possibile creare un sostituto diretto. Abbiamo quindi scelto di ripartire da zero, implementando un’interfaccia a riga di comando più intuitiva. A quel punto è stato chiaro che la migrazione dal vecchio al nuovo check non sarebbe potuta avvenire sempre in modo lineare. Lo scorso anno abbiamo sviluppato uno script di migrazione in grado di convertire la maggior parte delle regole dal vecchio al nuovo check. Alcune di esse richiederanno verosimilmente un intervento manuale, ma ci aspettiamo che solo una piccola percentuale non possa essere convertita automaticamente. In questi casi sarà necessario configurare manualmente il nuovo check oppure indicare una riga di comando per eseguire il vecchio check_http, come si farebbe con qualsiasi check attivo compatibile con Nagios non fornito da Checkmk. Approfondiremo questo aspetto più avanti.
 

Panoramica delle opzioni

Come utente del sito, esegui il comando cmk-migrate-http --help per avere una panoramica dei sottocomandi disponibili. Questi sono:

  • migrate: Migra le regole v1 alle regole v2. Questo sottocomando esegue un'anteprima o crea regole da utilizzare in contemporanea (per ora inattive). La modalità eseguita è determinata da parametri aggiuntivi: --dry-run--write.
  • activate: Attiva le regole v2 inattive create in precedenza.
  • deactivate: Disattiva le regole v2 attive, ma non finalizzate.
  • delete: Cancella tutte le regole v2 che non sono ancora state finalizzate.
  • finalize: Elimina le regole v1 migrate e rimuove i riferimenti dalle controparti v2. Questo passaggio è irreversibile!

Ogni sottocomando dispone della propria opzione di aiuto. In questo contesto, quelle relative a migrate sono le più importanti, poiché migrate prepara la migrazione. Tutte le azioni possono essere limitate a specifiche cartelle (opzionalmente in modo ricorsivo) e a determinati host. Quest’ultima opzione non si basa sui nomi degli host, ma sulle condizioni degli host.

Tieni inoltre presente che l’opzione relativa alle cartelle non funziona con i nomi così come appaiono nell’interfaccia grafica, ma con i nomi delle cartelle elaborati internamente (convertiti in minuscolo e con caratteri speciali e spazi sostituiti). Prova inizialmente a usare il nome della cartella che conosci. Se non viene trovato, ti verrà mostrato un elenco dei nomi interni disponibili:

cmk-migrate-http migrate --dry-run --folder 'a nested folder with spaces'
Starting dry run.
Importing...
Loading plugins...
Loading rule sets...
No folder found for the given argument. Use the 'script_folder_key' for the desired folder. Available folders:
Main > ''
badssl > 'badssl'
somefolder > 'somefolder'
somefolder/a nested folder with spaces > 'somefolder/a_nested_folder_with_spaces'

Qui, la cartella “Main” è effettivamente rappresentata da una stringa vuota, mentre in “somefolder/a nested folder with spaces” gli spazi sono stati sostituiti con underscore.

Eseguire la migrazione

Come accennato in precedenza, lo script di migrazione consente di eseguire una simulazione, testando in parallelo l’effetto delle regole v1 e v2 sul monitoraggio, per poi finalizzare la configurazione oppure eseguire un rollback in qualsiasi momento. Inoltre, puoi modificare qualsiasi nuova regola prima della finalizzazione. Se commetti un errore, ti basta effettuare il rollback e ricominciare da capo. In questo capitolo ti mostriamo nel dettaglio come eseguire una migrazione.

Primo step: La simulazione

Per prima cosa, esegui la simulazione:

cmk-migrate-http migrate --dry-run

Il check mostrerà quindi quante regole sono presenti, quante di queste possono essere convertite automaticamente e quante, invece, richiedono un intervento manuale. Nel caso di regole incompatibili, consigliamo di saltarne la migrazione. È possibile migrare solo le regole compatibili aggiungendo i flag appropriati, ad esempio

cmk-migrate-http migrate --dry-run --ssl-incompatible skip

per le regole trovate che tentano di forzare una versione obsoleta di TLS. Queste verranno ignorate e potrai gestirle in un secondo momento. Combina tutti i flag necessari per migrare solo le regole non ambigue in questa prima fase. Approfondirai la risoluzione dei conflitti più avanti. Quando sarai soddisfatto del risultato, esegui il comando con l'opzione --write per scrivere effettivamente le nuove regole (Es.):

cmk-migrate-http migrate --write --ssl-incompatible skip --v2-checks-certificate skip

Ora le regole migrate sono state scritte, ma sono inattive. Scorri tra di esse e verifica se ti sembrano ragionevoli.

Verifica del risultato

Hai due opzioni per abilitare le regole: utilizzare il sottocomando activate dello script per abilitare tutte le regole appena migrate, oppure abilitarle una ad una tramite l’interfaccia grafica. In entrambi i casi, dovrai anche attivare le modifiche per renderle effettive.

Ricorda che abilitare tutte le regole in un’unica operazione potrebbe causare un alto numero di servizi in stato CRIT, a seconda di quanto accuratamente erano configurate le vecchie regole. Poiché il vecchio check non controllava il nome dell'host presente nel certificato, il controllo della durata del certificato veniva effettuato sull’indirizzo IP. Per questo motivo, abbiamo modificato il comportamento predefinito in caso di un campo​​​​​​​ Address vuoto o non specificato, passando dall’indirizzo IP al nome dell'host.

Nota: Nel caso in cui tu abbia specificato manualmente un indirizzo IP a cui connetterti, dovrai modificare le regole migrate. Sentiti libero di modificare qualsiasi cosa. Ricorda che, se commetti un errore, puoi sempre disattivare tutte le regole migrate o addirittura annullare tutto e ricominciare da capo.

Rollback - Annullamenti delle modifiche

Potrebbe capitare spesso che alcune regole migrate non siano del tutto soddisfacenti. In questo caso, puoi eseguire un rollback parziale o completo. I rollback parziali vengono eseguiti eliminando semplicemente le regole v2 che non dovrebbero essere convertite in questa migrazione. I rollback completi vengono eseguiti utilizzando i sottocomandi deactivate e poi delete.

Finalizzazione della migrazione

Quando hai terminato, esegui il sottocomando finalize per rimuovere le vecchie regole check_http e rinominare il nuovo servizio con il vecchio nome. Il sottocomando rimuoverà anche il flag “migrated from UUID” che le regole migrate non finalizzate mantengono come riferimento. Tale riferimento è utile sia per gli utenti, per identificare le regole migrate che potrebbero necessitare di aggiustamenti fino a quando non si ottiene il comportamento desiderato, sia per lo script di migrazione, per facilitare eventuali rollback.

Per evitare comportamenti indesiderati e mantenere la possibilità di annullare le modifiche, non modificare né il commento “migrated from UUID”, né il nome del servizio prima di finalizzare la migrazione!

Sfide più comuni

Abbiamo già menzionato le difficoltà che potresti incontrare e consigliato di saltare le regole che non possono essere migrate senza l'interazione dell'utente. Adesso è però arrivato il momento di migrare queste regole. Per un totale di undici conflitti frequenti, forniamo la possibilità di risolvere il conflitto in modo automatico. Nella maggioranza dei casi, la risoluzione automatica porterà a regole v2 che funzionano come previsto, ma in alcuni casi potrebbe essere necessaria una configurazione aggiuntiva.

I problemi, la loro (parziale) risoluzione tramite la riga di comando e gli eventuali aggiustamenti necessari sono solo le sfide più importanti. Utilizza sempre il comando cmk-migrate-http migrate --help come riferimento: potremmo estendere le scelte per le opzioni di migrazione esistenti o aggiungere nuove opzioni in base alle necessità.

Gestione dei certificati

Quando si utilizzava check_http per i controlli URL con HTTPS abilitato, per impostazione predefinita non veniva verificata la validità del certificato. Il nuovo check v2, invece, verifica i certificati per impostazione predefinita. Sia che tu voglia adottare il nuovo comportamento, sia che preferisca restare più vicino al comportamento precedente, puoi specificarlo con --v2-checks-certificates insieme alle parole chiave skip, keep (per mantenere comportamento più rigoroso di v2) o disable (per ignorare completamente i controlli del certificato). Per poter successivamente combinare il controllo dei certificati e degli URL, consigliamo di usare keep.

Qualcosa di simile vale per i controlli esclusivi sui certificati: la versione 2 verifica sempre tutti gli aspetti di un certificato, mentre la versione 1 controlla solo la validità residua. Usa l’opzione --cant-ignore-certificate-validation per indicare se saltare la migrazione delle regole interessate oppure accettare il nuovo comportamento predefinito. Se hai già migrato i controlli URL con le impostazioni più rigorose, puoi facilmente aggiungere la verifica della validità residua al controllo URL stesso, risparmiando così un check attivo per host.

Un aspetto cruciale della gestione dei certificati è cambiato: il vecchio check utilizzava l'indirizzo dell'host come valore predefinito per i tentativi di connessione, anche nell'intestazione della richiesta HTTP, mentre il nuovo check utilizza il nome dell'host. Questo comportamento viene mappato anche durante la migrazione. Insieme al comportamento più rigoroso, ciò dovrebbe ridurre al minimo i problemi derivanti dalla migrazione. Tuttavia, nel caso in cui tu abbia specificato manualmente la macro $HOSTADDRESS$, essa non verrà sostituita e potresti ritrovarti con dei check falliti.

Incompatibilità relative alle versioni TLS/SSL

La versione 2 del check supporta solo TLS 1.2 e 1.3. Potresti aver specificato regole che forzano versioni più vecchie, non supportate dal nuovo check. In tal caso, puoi usare --ssl-incompatible e negotiate per modificare la regola migrata in una negoziazione della versione.

Nel caso tu abbia davvero bisogno di monitorare host con versioni TLS/SSL così obsolete, potrebbe esserti utile la guida che abbiamo pubblicato per la release di Checkmk 2.3.0, in cui l'aggiornamento di OpenSSL alla versione 3.x ha causato incompatibilità con TLS 1.0 e versioni precedenti.

Header

Mentre il vecchio check_http permetteva una definizione libera sia dei request che dei response header, il nuovo check richiede un set specifico di coppie campo-valore. Le regole che non seguono lo schema “Header: value” richiedono una decisione da parte dell'utente. Usa --add-headers-incompatible e --expect-response-header con le parole chiave skipignore per saltare la migrazione della regola o forzare la migrazione con l'opzione rimossa. Puoi apportare correzioni in seguito, se necessario.

Status codes

Con il vecchio check era possibile specificare status codes arbitrari. Non solo numeri a tre cifre come 320 (o 737…), ma anche stringhe (per maggiori dettagli vedi Werk 17738). In alcuni casi, quando la stringa specificata veniva trovata da qualche parte negli header della risposta, non veniva segnalato alcun errore. Per continuare a ignorare tali status codes errati, usa --only-status-codes-allowed insieme alla parola chiave ignore per migrare tali regole rimuovendo lo status code errato. Una volta fatto, verifica attentamente.

Redirect

Il vecchio check non seguiva il reindirizzamento per verificare altri aspetti della risposta, come le stringhe nel body. Il nuovo check segue prima i reindirizzamenti e poi esegue i controlli. Usa --v1-skips-redirect-response acknowledge per confermare il nuovo comportamento predefinito. Successivamente, potrai affinare le impostazioni dei reindirizzamenti durante i test e la modifica delle regole.

HTTP method

Il nuovo check non supporta più OPTIONS, TRACE, CONNECT, CONNECT_POST, PROPFIND. Nel caso in cui li avessi configurati per il vecchio check, puoi usare --method-unavailable per ignorare questi metodi e passare a GET (quando non sono presenti dati POST) o a POST (nel caso siano presenti dati POST).

Inoltre, il vecchio check permetteva di configurare i dati POST per metodi non POST. Se viene trovata tale configurazione, puoi usare​​​​​​​ --cant-post-data​​​​ post per cambiare il metodo in POST oppure --cant-post-data prefermethod per migrare il metodo, ma ignorare i dati POST.

Proxy

A causa delle diverse strutture e dipendenze dei dati, la migrazione delle impostazioni proxy non è supportata. Tutte le regole che utilizzano proxy verranno ignorate e dovranno essere migrate manualmente. Consigliamo di configurare prima i proxy tramite le impostazioni globali e, successivamente, di ricreare le regole in modo appropriato.

Conclusione

Poiché è quasi impossibile testare tutte le combinazioni di impostazioni del vecchio check_http, potrebbe esserci una piccolissima percentuale di regole che non possono essere migrate automaticamente e devono essere migrate manualmente. Riteniamo che ciò riguarderà principalmente le regole con parametri logicamente incompatibili tra loro. Il vecchio check_http permetteva la specifica simultanea di parametri mutuamente esclusivi, dando però priorità ad alcuni rispetto ad altri, il che talvolta portava a comportamenti inaspettati. Abbiamo cercato di intercettare tali combinazioni nell'interfaccia grafica (GUI) di configurazione. Con il nuovo check, questo aspetto è stato considerato fin dalla progettazione ed è stato implementato in modo coerente in tutti i punti: configurazione, generazione della riga di comando e valutazione della riga di comando.

Con Checkmk 2.5.0 non sarà più possibile creare nuove regole per il vecchio check_http: Questa possibilità verrà del tutto rimossa in un secondo momento, ma il check da riga di comando resterà disponibile. Se necessario, potrai comunque continuare a configurare check_http tramite la regola 'Integrate Nagios plug-ins'.

Inizia quindi presto la migrazione, partendo dalle operazioni più semplici e ottenendo anche un aumento delle prestazioni grazie alla combinazione di monitoraggio di certificati e contenuti/risposte in un'unica regola. Affronta le attività più complesse quando hai tempo. Raccontaci quali strategie hanno reso efficace la tua migrazione: Potremmo pubblicare un post di approfondimento con le best practice.


Addendum: A partire da Checkmk 2.4.0p2 (Werk 17742), lo script di migrazione ignora le regole disabilitate utilizzando l'opzione Do not apply this rule. Questo significa che dovrai preoccuparti solo delle regole effettivamente in uso.