dla czytelników pochodzących na to pytanie i odpowiedź w przyszłości, które mogą nie być zaznajomieni z kuchni, run Chef „zbieżny” węzeł, czy przynosi to zgodne z polityką zadeklarowanej przepis (receptury), który jest uruchomiony. Nazywa się to również "konwergencją". Ma to dwie fazy: "kompiluj" i "wykonaj". Faza kompilacji jest wtedy, gdy Chef ocenia ("kompiluje") kod Ruby receptur, szukając zasobów do dodania do Kolekcji Zasobów. Gdy to się stanie, "wykonuje" działania dla każdego zasobu, aby wprowadzić go w pożądany stan. Polecenia systemowe są prowadzone itd
Erik Hollensbe napisał doskonała spacer po z how this works in 2013.
Teraz, po odpowiedzi:
Istnieje kilka sposobów, aby kończą bieg kucharz, lub Wyjdź przepis Chef, w zależności od tego, jak chcesz się do tego zabrać, ponieważ przepisy są Chef kod Ruby.
Jeśli Twoim celem jest zatrzymanie przetwarzania receptury na podstawie warunku, ale kontynuuj z resztą cyklu, użyj słowa kluczowego Ruby o wartości return
. Na przykład:
file '/tmp/ponies' do
action :create
end
return if node['platform'] == 'windows'
package 'bunnies-and-flowers' do
action :install
end
Zakładamy, że jeśli system Windows, to nie ma menedżera pakietów, które można zainstalować pakiet zajączki i-kwiaty, więc wracamy.
Jeśli chcesz przerwać Chef uruchomić całkowicie
Istnieje kilka innych rzeczy, które możesz zrobić. Szef kuchni kończy pracę, jeśli napotka nieobsługiwany wyjątek w dowolnym miejscu w biegu szefa kuchni. Na przykład, jeśli zasób szablonu nie może znaleźć pliku źródłowego lub jeśli użytkownik uruchamiający program Chef nie ma uprawnień do zrobienia czegoś takiego jak utworzenie katalogu. Właśnie dlatego użycie polecenia raise
kończy proces.
Sprawa, w której umieszcza się raise
. Jeśli użyjesz go w zasobie ruby_block
, będzie on podnosił się tylko podczas fazy konwergencji. Jeśli użyjesz go poza zasobem, takim jak powyższy przykład return
, stanie się to podczas fazy kompilacji.
file '/tmp/ponies' do
action :create
end
raise if node['platform'] == 'windows'
package 'bunnies-and-flowers' do
action :install
end
Być może mamy menedżera pakietów w systemie Windows i chcemy, aby ten pakiet był zainstalowany. Podbicie spowoduje, że Chef fatalnie wyjdzie i da ślad stosu. Kolejną metodą jest użycie Chef::Application.fatal!
. Spowoduje to zarejestrowanie komunikatu fatal
do rejestratora Chef i STDERR, a następnie zamknięcie aplikacji. Możesz również podać kod powrotu (może masz skrypt, który to sprawdza?).
Chef::Application.fatal!("Didn't expect the Spanish Inquistion", 42) if spanish_inquisition
(oczywiście spanish_inquisition
jest zwykle zero, ponieważ nikt nie spodziewa ... I błądzić ...)
Spowoduje to wyjście szefa kuchni, przesłanie logu i kod powrotu 42 z procesu.
Uwaga: To powoduje, że całą aplikację, aby wyjść, to znaczy, jeśli jest uruchomiony jako daemonized usługi, to zakończyć, w zależności od sposobu usługa jest zarządzana, to może lub nie może się zacząć ponownie. Na przykład usługa init.d
nie zostanie ponownie uruchomiona, ale usługa zostanie wykonana.
Ponieważ receptury są w języku Ruby, możesz również płynnie obsługiwać warunki błędu za pomocą bloku begin..rescue
.
begin
dater = data_bag_item(:basket, "flowers")
rescue Net::HTTPServerException
# maybe some retry code here?
raise "Couldn't find flowers in the basket, need those to continue!"
end
data_bag_item
wysyła żądanie HTTP do worka danych na Chef Server, a zwróci Net::HTTPServerException
jeśli istnieje problem z serwerem (404 not found, 403 nieautoryzowane, etc). Możemy spróbować ponownie spróbować lub wykonać inne czynności, a następnie wrócić do wersji raise
.
Błędy Reporting
Wystarczy opuszczające i podrzucanie ślad stosu jest w porządku, jeśli używasz Chef z linii poleceń. Jeśli jednak używasz go w cronie lub jako demon na kilku, a nawet dziesiątkach lub setkach maszyn, nie jest to świetny sposób na zachowanie zdrowia psychicznego, gdy występują problemy.
Wpisz Chef's report/exception handler feature. Możesz użyć handler'a do biegania Chef's. Wszystkie procedury obsługi raportów są uruchamiane na końcu serii Chef. Urządzenia obsługi wyjątków są uruchamiane po zakończeniu przerwanego uruchomienia Chef. Status przebiegu jest śledzony i może być sprawdzony w procedurze obsługi, więc możesz napisać taki, który obsługuje oba rodzaje runów (pomyślne/zakończone lub nieudane/przerwane).
The documentation mówi, jak go napisać. Obejmuje ona również listę dostępnych open source handlers, które można wykorzystać do różnych usług, w tym:
- e-mail przez SMTP
- IRC
- Graphite
- HipChat
i kilka więcej .
Niesamowita odpowiedź! Bardzo pomocne. Szukałem tego w różnych zasobach Chef, ale go nie znalazłem. Gdybym to zrobił, to pytanie nie istniałoby.Niedawno zdecydowałem, że gdy szukałem odpowiedzi na pytanie i nie znalazłem jej ani na Stackoverflow, czy łatwo z oczekiwanych zasobów, to gdybym miał odpowiedź, skompilowałem parę pytań i odpowiedzi Stackoverflow, by uchwycić to, czego się nauczyłem. . –
Nigdy nie udało mi się uzyskać 'rescue Net :: HTTPServerException' do pracy. Nie ratuje wyjątku. – Zabba
kochał komentarz hiszpańskiej inkwizycji :-) – Mamun