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?
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życieraise
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
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
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
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.
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
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