2015-06-03 12 views
11

Qual è la differenza fondamentale tra convergenza e idempotenza in Chef?Differenza tra convergenza e idempotenza in Chef

+0

Qual è il tuo problema? la convergenza è una delle fasi di una corsa da chef (fai una ricerca su http.docs.chef.io a riguardo), idempotenza è un termine matematico per f (x) = f (f (x)): Vale a dire il risultato finale dovrebbe essere lo stesso non correlato a quante volte viene chiamata la funzione sul suo risultato => fare qualcosa solo di necessario => non toccare un file il cui contenuto è già il contenuto previsto – Tensibai

risposta

27

La convergenza e l'idempotenza non sono specifiche dello Chef. Generalmente vengono attribuiti alla teoria della gestione della configurazione, sebbene siano utilizzati in altri campi, in particolare la matematica.

Iniziamo con il più semplice, idempotente. Ignoreremo l'uso matematico dell'idempotente e ci concentreremo invece su cosa intendano le persone che gestiscono la configurazione quando ne parlano. Cioè: "più applicazioni della stessa azione non hanno effetti collaterali sullo stato del sistema". Un semplice esempio di un'operazione idempotent è mkdir -p:

mkdir -p /var/lib/statedir/myapp 

Non importa quante volte si corre questo comando, che si tradurrà in quell'albero sta creando. Un altro modo per affermare ciò sulle operazioni idempotenti è "eseguire lo strumento più e più volte non cambia il sistema dopo la prima volta".

Ora per contrastarlo con la convergenza. In generale, convergere significa mettere insieme [persone o] cose. Nella gestione della configurazione, la convergenza significa portare lo stato del sistema in linea con una politica definita. Cioè, i cambiamenti sono fatti sul sistema solo se devono essere fatti. Un semplice esempio di un'operazione di convergenza è:

if [ ! -d /var/lib/statedir/myapp ]; then 
    mkdir -p /var/lib/statedir/myapp 
fi 

Questo è convergente perché stiamo solo eseguendo il comando mkdir se la directory desiderata non esiste. Chiamiamo anche questa operazione "test and repair". Cioè, testiamo lo stato corrente della specifica cosa che stiamo gestendo e poi lo ripariamo con uno specifico comando o operazione se non è in quello stato. Questo è ciò che Chef fa dietro le quinte con una risorsa come questo:

directory '/var/lib/statedir/myapp' do 
    recursive true 
end 

Il modo in cui (Chef) parla di questo è che lo Chef prende azioni per convergere il sistema allo stato dichiarato dalle varie risorse idempotente. Ogni risorsa in Chef è dichiarativa ed esegue un test sullo stato corrente della risorsa, quindi ripara il sistema per farlo corrispondere.

Per approfondire la conoscenza di come lavora lo chef, ha una fase di "compilazione" e una fase di "convergenza" in una corsa di chef. Nella fase di "compilazione", valuta le ricette Ruby sul nodo e cerca gli oggetti risorsa che aggiunge a una "raccolta risorse". Dopo aver valutato tutte le ricette, entra nella fase di "converge" dove itera sulla raccolta delle risorse, prendendo l'azione appropriata per mettere le risorse nello stato desiderato, in cui gli utenti vengono creati, i file vengono scritti, i pacchetti vengono installati, e così via.

+0

Questa è stata una spiegazione davvero eccezionale !! Ero a conoscenza del concetto di convergenza nello chef ma non dell'idempotenza. Grazie per l'articolazione. :) – dextren

+0

-1. Non trovo che questa sia una spiegazione particolarmente chiara; fa sembrare idempotenza e convergenza come se fossero fondamentalmente la stessa cosa, dal momento che i comandi che usi come esempi dei due concetti sono semanticamente identici. Un esempio di un comando idempotent-but-not-convergent (o un comando convergente ma non idempotente, se una cosa del genere ha senso) aggiungerebbe chiarezza. –