Mam książkę kucharską szefa kuchni, z wieloma przepisami, która instaluje usługę. Sposób, w jaki pracuje kucharz-klient, ponownie się zbiegają co 15 minut (lub jakikolwiek inny regularny interwał). W tej chwili pierwszym krokiem mojej książki kucharskiej jest zatrzymanie usługi, więc usługa zatrzyma się co 15 minut, ale naprawdę chcę tego uniknąć. Problem polega na tym, że usługa musi zostać zatrzymana, aby wykonać kilka czynności.Z szefem kuchni, jak wykonać "zasób 1" przed "zasobem 2", w zależności od wykonania "zasobu 2"?
Gdybym miał tylko jeden lub dwa warunki w zasobach moich receptur, mogę po prostu zrobić:
condition1 = ... # some true/false values
condition2 = ... #
service myservice do
only_if { condition1 or condition2 }
action :stop
end
resource1 do
only_if { condition1 }
end
resource2 do
only_if { condition2 }
end
Ale jak mam kilkanaście warunków, w wielu recepturach, robi nieeleganckie. Czy istnieje sposób na wykonanie tego pseudokodu?
service_resource = service myservice do
# somehow don't execute this right now, but wait for
# signal from resource1 or resource2
action :stop
end
resource1 do
make sure service_resource executed first
only_if { condition1 }
end
resource2 do
make sure service_resource executed first
only_if { condition2 }
end
Jeśli nie było pewne „powiadamia: Przed” mechanizmu Chef (zamiast na przykład „zawiadamia niezwłocznie”), mogę to wykorzystać, ale nie znaleziono niczego w tym rodzaju. Jakieś pomysły?
EDIT:
Po myśleć o tym trochę więcej, inny sposób to zrobić, jeszcze nie jest doskonały, ale lepiej byłoby, korzystając z kompilacji fazie Chef definiując jeden atrybut, który jest zastąpiony. W ten sposób przynajmniej nie musimy utrzymywać wszystkich warunków w jednym miejscu.
# in an "attributes" file:
default["stop_service"] = false
# in some recipe:
service myservice do
action :stop
only_if { node["stop_service"] }
end
# ... later, or in some other recipe file
condition1 = ... # true/false
if condition1
# I think this executes before the only_if of the "service" resource
override["stop_service"] = true
end
resource1 do
only_if { condition1 }
end
Większość usług w systemach operacyjnych podobnych do systemu UNIX może mieć swoją konfigurację (lub nawet kod, o ile lokalny menedżer pakietów zastępuje pliki, tworząc nowe i-węzły zamiast przepisywania istniejących i-węzłów, aby zawierały nowe treści), aktualizując je na bieżąco, dlatego to nie jest często występuje problem - usługa nie musi być zatrzymywana przed rekonfiguracją lub aktualizacją. –
@CharlesDuffy Na koniec może na tym polegam, ale to, co napisałem, jest w rzeczywistości uproszczeniem: mamy szereg usług i nie jestem pewien, czy wszystkie z nich mogą mieć zmienioną konfigurację podczas działania. Sądzę, że przynajmniej jeden z nich automatycznie wczytuje swoją konfigurację, aby mógł przeładować, chociaż zastosowano tylko częściowe zmiany.Również w przypadku niektórych przepisów dołączamy/zastępujemy istniejące pliki, więc w tych przypadkach nie używamy nowych i-węzłów (jeśli dobrze rozumiem, co masz na myśli). – fsdj
Zależy dokładnie, w jaki sposób dodać/wymienić funkcjonalność działa - bezpieczne implementacje (gdy dane są dołączane jest więcej niż pasuje w jednym syscall lub gdy potrzebne są jakiekolwiek zmiany w miejscu), pisząc pracę tymczasowy plik w tym samym katalogu i zmieniając nazwę nad miejscem docelowym. Ale tak, ma sens, że chcesz chcesz zrobić restart (lub SIGSTOP i SIGCONT, jeśli jest obsługiwany) wokół zmian konfiguracyjnych jeśli chcesz te zmiany były atomowy, wielokrotne pliki są modyfikowane i automatyczne zachowanie przeładowania jest realizowany. –