2013-01-12 6 views
50

Pod pewnymi warunkami muszę przerwać/zakończyć pracę szefa kuchni z niezerowym kodem statusu, który następnie rozprzestrzeni się za pośrednictwem naszego łańcucha wdrażania, a ostatecznie do Jenkinsa, co spowoduje dużą, grubą czerwoną piłkę.Jak przerwać/zakończyć bieg szefa kuchni?

Jaki jest najlepszy sposób na zrobienie tego?

Odpowiedz

104

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 .

+2

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. . –

+1

Nigdy nie udało mi się uzyskać 'rescue Net :: HTTPServerException' do pracy. Nie ratuje wyjątku. – Zabba

+0

kochał komentarz hiszpańskiej inkwizycji :-) – Mamun

7

Zalecanym sposobem przerwania lub edycji uruchomienia Chef jest zgłoszenie wyjątku. Oto przykład:

ruby_block "some tricky operation" do 
    block do 
    OperationFoo 
    raise "Operation Foo Failed" if some_condition 
    end 
end 
4

Szef kuchni :: Application.fatal! powinien zrobić to, czego szukasz. Oto przykład z naszej bazy kodu, który może być pomocny.

cipher = case key.length 
    when 16 then "AES-128-ECB" 
    when 24 then "AES-192-ECB" 
    when 32 then "AES-256-ECB" 
else 
    Chef::Application.fatal!("AES Key must be 16, 24, or 32 characters in length but key #{key} has length of #{key.length}") 
end 
-3

Aby zrobić nieczystego zjazd podczas biegu kucharz-solowej, spróbuj tego:

bash 'exit' do 
    code 'killall -9 chef-solo' 
end 
-1

Wystarczy skorzystać z poniższego zestawienia, gdy chcesz chef zakończyć po pewnym działania:

throw :end_client_run_early 

Wyjdzie bez żadnego błędu.