Cercando di capire l'approccio migliore per un grande progetto. Quando è opportuno aggiungere ricette all'interno di una ricetta utilizzando include_recipe
anziché aggiungere la ricetta allo run_list
? C'è una buona regola empirica?Devo usare include_recipe o aggiungere la ricetta a run_list?
risposta
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.
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.
Ma quando c'è una linea
include_recipe 'java'
nel libro di cucina Tomcat, che richiede anche una lineadepends '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.
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.
Suppongo che si dovrebbe usare 'include_recipe' per rendere esplicita una dipendenza. – user1071847
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? –
Non carica la stessa ricetta più volte. Lo salta, se lo ha già visto. –
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. –