Próba znalezienia najlepszego podejścia do dużego projektu. Kiedy należy dodawać receptury do receptury, używając include_recipe
, a nie dodając przepis do run_list
? Czy istnieje dobra zasada?Czy powinienem użyć include_recipe lub dodać przepis do run_list?
Odpowiedz
Jak widzę, każdy przepis powinien być w stanie działać na pustej maszynie. Więc jeśli jakaś receptura A zależy od receptury B przed nią, zawsze używam include_recipe.
Na przykład: 2 książki kucharskie, tomcat i java. Tomcat wymaga języka Java.
Kiedy jakiś użytkownik chce zainstalować tomcat, może nie mieć pojęcia, że faktycznie potrzebuje innej książki kucharskiej, aby go zainstalować. On uruchamia przepis tomcat i albo zawiedzie z jakąś zupełnie niepomyślną informacją o błędzie, taką jak "No java found", albo jeszcze gorzej - to się uda, ale oczywiście użytkownik nie może uruchomić tomcat, ponieważ nie ma zainstalowanej javy.
Ale gdy istnieje linia
include_recipe 'java'
w tomcat książki kucharskiej, która wymaga również liniędepends 'java'
w metadanych, gdy użytkownik próbuje zainstalować Tomcat, ujrzy zrozumiały komunikat o błędzie: „java cookbook nie znaleziono”. W ten sposób użytkownik może pobierać zależności samodzielnie (lub nawet za pomocą automatycznego narzędzia) bez uruchamiania receptur, ale odczytywanie metadanych.
Cała logika powinna być kontrolowana za pomocą list biegowych. Książki kucharskie, próbuj jak mogą, nie są tak samo przydatne jak ludzie chcieliby myśleć. Wszystko, co robi include_recipe
, to dodanie kolejnego miejsca, w którym użytkownicy muszą się zastanowić, co ma zamiar zrobić lista uruchamiania, i wyraź je i umieść na liście uruchamiania.
Zakładam, że należy użyć 'include_recipe', aby uzależnić jawnie. – user1071847
Jak inteligentny jest szef kuchni w kwestii unikania powtarzania przepisów? Więc jeśli twoja książka kucharska zależy od 'rodzica', to' include_recipe parent' i jakaś nieświadoma dusza dodaje 'rodzica' do listy wyników, czy' parent :: default.rb' jest uruchamiana dwukrotnie? Jeśli "rodzic" został [prawidłowo stworzony] (http://docs.opscode.com/chef_why.html#idempotence), nic złego się nie stanie z maszyną, ale ile czasu zmarnuje, gdy zaczniesz ładować/konwergować nowy węzeł? Jeśli Chef nie jest automagiczny w unikaniu duplikacji, czy istnieje zalecany sposób uniknięcia tego ręcznie? –
Nie ładuje tej samej receptury kilka razy. Pomija to, jeśli już to widział. –
Przypuszczam, że jest to korzyść z idempotencji: jeśli masz gwarancję tego samego wyniku, niezależnie od tego, ile razy go uruchomisz, wiesz, że możesz go pominąć, jeśli jest już uruchomiony! Dzięki, Draco. –