2013-06-05 8 views

risposta

72

Come ho visto, qualsiasi ricetta dovrebbe essere in grado di funzionare su una macchina vuota da sola. Quindi se qualche ricetta A dipende dalla ricetta B eseguita prima, io uso sempre include_recipe.

Ad esempio: 2 libri di cucina, tomcat e java. Tomcat richiede java.

  1. Quando un utente desidera installare Tomcat, potrebbe non avere idea di richiedere effettivamente un altro libro di cucina per installarlo. Esegue la ricetta del tomcat e fallisce con un messaggio di errore del tutto inutile come "No java found" o anche peggio - ci riesce, ma ovviamente l'utente non può avviare tomcat, perché non ha java installato.

  2. Ma quando c'è una linea include_recipe 'java' nel libro di cucina Tomcat, che richiede anche una linea depends 'java' nei metadati, l'utente quando si tenta di installare Tomcat, vedrà il messaggio di errore comprensibile: "il libro di cucina Java non trovato". In questo modo l'utente può scaricare le dipendenze da solo (o anche con uno strumento automatico) senza eseguire effettivamente le ricette, ma leggendo i metadati.

+7

Quanto è intelligente lo Chef per evitare la ripetizione di ricette? Quindi se il tuo libro di cucina dipende da 'parent', tu' includi parent_recipe' e qualche anima inconsapevole aggiunge 'parent' alla lista di esecuzione,' genitore :: default.rb' viene eseguito due volte? Se 'parent' è stato [creato correttamente] (http://docs.opscode.com/chef_why.html#idempotence), non accadrà nulla di brutto sulla macchina, ma quanto tempo sprecherà quando avvii/converge una nuova nodo? Se lo chef non è automagic nell'evitare la duplicazione, esiste un metodo consigliato per evitarlo manualmente? –

+6

Non carica la stessa ricetta più volte. Lo salta, se lo ha già visto. –

+0

Suppongo che sia un vantaggio di idempotence: se si è certi di avere lo stesso risultato indipendentemente da quante volte lo si esegue, allora si sa che è possibile saltare se è già stato eseguito! Grazie Draco. –

1

Tutta la logica deve essere controllata con le liste di corsa. I libri di cucina, per quanto provengano, non sono riutilizzabili come le persone vorrebbero pensare. Tutto ciò che fa include_recipe è aggiungere un altro posto dove gli utenti devono cercare di capire che cosa farà la lista di corsa, quindi renderla esplicita e metterla nella lista di esecuzione.

+1

Suppongo che si dovrebbe usare 'include_recipe' per rendere esplicita una dipendenza. – user1071847