Jak przerwać / zakończyć bieg kucharza?

Pod pewnymi warunkami, muszę przerwać / zakończyć Chef run z niezerowym kodem statusu, który potem będzie rozprzestrzeniał się z powrotem przez nasz łańcuch rozmieszczania i ostatecznie do Jenkinsa, powodując wielką, tłustą czerwoną kulę.

Jaki jest najlepszy sposób na to?

Author: Jordan Dea-Mattson, 2013-01-12

5 answers

[18]}dla czytelników, którzy w przyszłości mogą nie być zaznajomieni z Chef run, Chef run "zbiega" węzeł lub dostosowuje go do polityki zadeklarowanej w recepturze (recepturach), którą uruchamia. Jest to również nazywane " konwergencją."Składa się z dwóch faz: "compile" i "execute"."Faza kompilacji jest wtedy, gdy Chef ocenia ("kompiluje") kod Ruby receptur, szukając zasobów do dodania do kolekcji zasobów. Po zakończeniu "wykonuje" działania dla każdego zasób, aby umieścić go w pożądanym stanie. Uruchamiane są Polecenia systemowe, itd.

Erik Hollensbe napisał Doskonały spacer przez Jak to działa w 2013 roku .

Teraz na odpowiedź:

Istnieje kilka sposobów na zakończenie pracy szefa kuchni lub wyjście z przepisu szefa kuchni, w zależności od tego, jak chcesz to zrobić, ponieważ przepisy szefa kuchni są kodem Ruby.

Jeśli twoim celem jest zaprzestanie przetwarzania przepisu na podstawie warunku, ale kontynuuj z resztą Uruchom, a następnie użyj słowa kluczowego return Ruby. 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 jest Windows, To nie ma menedżera pakietów, który mógłby zainstalować pakiet bunnies-and-flowers, więc wracamy.

Jeśli chcesz przerwać kucharza Uruchom całkowicie

Jest kilka innych rzeczy, które możesz zrobić. Chef wychodzi, jeśli napotka nieobsługiwany wyjątek w dowolnym miejscu biegu Chef. Na przykład, jeśli zasób szablonu nie może znaleźć pliku źródłowego lub jeśli użytkownik szef kuchni nie ma uprawnień do zrobienia czegoś takiego jak tworzenie katalogu. To dlatego użycie raise działa, aby zakończyć bieg.

Gdzie umieścić raise ma znaczenie. Jeśli użyjesz go w zasobie ruby_block, zwiększy się on tylko w fazie realizacji w 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. Podwyżka spowoduje / Align = "center" bgcolor = "# e0ffe0 " / król Danii / / align = center /

Innym podejściem jest użycie Chef::Application.fatal!. Zapisuje wiadomość fatal do Chef logger i STDERR i kończy działanie aplikacji. Możesz też nadać mu kod zwrotny (może masz skrypt, który je sprawdza?).

Chef::Application.fatal!("Didn't expect the Spanish Inquistion", 42) if spanish_inquisition

(oczywiście spanish_inquisition jest zwykle zero, ponieważ nikt się tego nie spodziewa... Dygresję...)

Spowoduje to wyjście Szefa Kuchni, wysłanie wiadomości dziennika i kodu zwrotnego 42 z procesu.

Uwaga : Powoduje to zamknięcie całej aplikacji, co oznacza, że jeśli jest uruchomiona jako usługa demonizowana, zakończy się i w zależności od tego, jak usługa jest zarządzana, może lub nie może uruchomić się ponownie. Na przykład usługa init.d nie zostanie uruchomiona ponownie, ale usługa runit zostanie uruchomiona.

Ponieważ receptury są Ruby, możesz również z gracją obsługiwać warunki błędów 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 dla worka danych na serwerze Chef i zwraca Net::HTTPServerException, jeśli wystąpi problem z serwera (404 nie znaleziono, 403 nieautoryzowano, itp). Moglibyśmy spróbować ponownie lub wykonać inną obróbkę, a następnie wycofać się do raise.

Zgłaszanie Błędów

Wystarczy wyjść i wrzucić ślad stosu, jeśli uruchamiasz Chef z wiersza poleceń. Jednak jeśli używasz go w cron lub jako demona na kilku, a nawet dziesiątkach lub setkach maszyn, nie jest to świetny sposób na zachowanie zdrowego rozsądku, gdy występują problemy.

Enter Chef ' s funkcja report / exception handler . Możesz użyć opiekuna do biegania Szefa Kuchni. Wszystkie osoby zajmujące się raportowaniem są prowadzone pod koniec biegu kucharza. Obsługa wyjątków jest uruchamiana na końcu przerwanego biegu Szefa Kuchni. Status biegu jest śledzony i może być sprawdzany w programie obsługi, więc możesz napisać taki, który obsługuje oba rodzaje biegu (pomyślny/zakończony lub nieudany/przerwany).

Dokumentacja mówi ci, jak ją napisać. Zawiera również listę dostępnych open source obsługa , które można wykorzystać do różnych usług, w tym:

  • e-mail przez SMTP
  • IRC
  • Grafit
  • HipChat
I kilka innych.
 106
Author: jtimberman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 19:28:29

Zalecanym sposobem przerwania lub edycji biegu szefa kuchni 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
 7
Author: Jordan Dea-Mattson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-13 01:02:32

Chef:: Aplikacja.fatalne! powinieneś robić 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
 5
Author: John T Dyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 20:35:18

Po prostu użyj poniższej instrukcji, gdy chcesz chef zakończyć po jakiejś akcji:

throw :end_client_run_early

Zakończy się bez żadnego błędu.

 -1
Author: Shivendra Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-19 11:38:34

Aby zrobić nieczyste wyjście podczas biegu Solo, spróbuj tego:

bash 'exit' do
    code 'killall -9 chef-solo'
end
 -3
Author: dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 16:25:40