Jak upewnić się, że usługa działa, korzystając z Chef?

10

Jestem w sytuacji, w której szef kuchni może uruchomić usługę (postgres), ale później może zostać zatrzymany poza pasmem. Chcę, aby kolejne uruchomienie szefa kuchni spowodowało uruchomienie usługi. Próbowałem tego:

service "postgresql" do
    action :start
end

Ale to nie ma żadnego efektu, mówiąc (up to date)przypuszczalnie dlatego, że szef kuchni wie, że został rozpoczęty i nie jest w stanie powiedzieć, że przestał. (Być może z powodu tego, jak service ... statuszachowuje się ta usługa?) Jeśli to napiszę:

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end

Dostaję pożądane zachowanie. Również action :restartsprawia, że ​​działa. Jednak wydają się być anty-wzorami ze względu na przenośność (i potencjalnie zatrzymanie go przed ponownym uruchomieniem w tym ostatnim przypadku).

Jak mogę więc powiedzieć Szefowi Kuchni, aby siłą uruchomił usługę, nawet jeśli sądzi, że już działa?

Korzysta z Chef 11.6, hostowanego przez OpsCode i domyślnej receptury postgresql. (Uwaga: jest to podobne, ale nie do końca takie samo, jak wymuszanie akcji na „aktualnych” zasobach szefa kuchni? )

--- EDYCJA (wyjaśnienie po post Jtimberland) ---

W -l debugtym miejscu pokazuje:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

Nawet gdy NIE jest uruchomiony. To brzmi jak jeden błąd i jestem tym zainteresowany. Jednak przede wszystkim interesuje mnie to, czy istnieje sposób, aby powiedzieć szefowi kuchni „zawsze wywołuj polecenie uruchomienia usługi, pomijając sprawdzanie statusu”. Oto pytanie tutaj.

(Nie jestem ekspertem, ale myślę, że najbardziej przenośnym sposobem na zapewnienie działania usługi jest uruchomienie usługi i prawie zawsze jest to idempotentne. OTOH sprawdzanie, czy usługa jest uruchomiona, jest mniej spójne i nie rozumiem, dlaczego powinniśmy się tym przejmować !)

Częściowe zachmurzenie
źródło

Odpowiedzi:

11

Domyślnie szef kuchni sprawdza, czy usługa jest uruchomiona, i uruchamia ją, jeśli usługa nie jest uruchomiona.

Sposób, w jaki określa, że ​​usługa jest uruchomiona, zależy.

Domyślnie szef kuchni będzie próbował dopasować nazwę usługi ( postgresqltutaj) w tabeli procesów przy użyciu ps.

ps -ef | grep postgresql

Głównie. Nazwa usługi zostanie użyta do dopasowania wzorca podczas sprawdzania tabeli procesów. Może to być lub nie być to, czego chcesz / potrzebujesz, szczególnie w zależności od platformy i tego, jak nazywa się usługa „postgresql”.

Możesz jednak powiedzieć Szefowi Kuchni, że usługa obsługuje polecenie „status”, co oznacza, że ​​Szef zazwyczaj zrobi coś takiego,

/etc/init.d/postgresql status

I użyj kodu powrotu, aby ustalić, czy jest uruchomiony, czy nie (niezerowy nie jest uruchomiony).

Szef kuchni nie robi tego domyślnie, ponieważ nie wszystkie skrypty serwisowe obsługują polecenie statusu (frustrujące), a szef kuchni z natury nie wie, co należy zrobić. Próbuje zrobić rozsądną, domyślną rzecz, ale czasem naiwną. W ten sposób możesz powiedzieć Szefowi Kuchni, że zasób ma polecenie statusu i nie być tak naiwnym.

service "postgresql" do
  supports :status => true
  action :start
end

Teraz, jeśli usługa nie jest tak naprawdę nazwana „postgresql”, ale jest zamiast niej „postgresql-92” lub podobna, możesz to zrobić w następujący sposób:

service "postgresql-92" do
  supports :status => true
  action :start
end

lub

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end

Możesz dowiedzieć się, co się dzieje bardziej szczegółowo, uruchamiając szefa kuchni z wyjściem debugowania:

chef-client -l debug
jtimberman
źródło
Jest to przydatne, ale nie do końca odpowiada na pytanie. Chcę to powiedzieć :start bez względu na :status. Mam również nadzieję, że zrobi coś ps -ef | grep [p]ostgresqlpodobnego, w przeciwnym razie zwykle będzie pasować do własnego polecenia grep, a zatem zawsze będzie myśleć, że usługa jest uruchomiona. (A może to jest podstawowy problem?)
Częściowe zachmurzenie
Wydaje mi się, że w Chefie jest błąd lub coś jest nie tak z systemem. Na jakiej platformie / platformie_wersja prowadzisz? Jak zainstalowałeś postgresql? Pakiet, źródło?
jtimberman
Aby odrobić, Chef podejmuje idempotentne działania w celu zarządzania zasobami zdefiniowanymi w sposób deklaratywny. Aby upewnić się, że usługa jest uruchomiona w / Chef, należy wysłać do usługi akcję startową. Jeśli tak się nie dzieje, oznacza to błąd w Chefie, błąd w przepisie lub błąd w systemie.
jtimberman
Dzięki @jtimberman. Otworzyłem błąd dotyczący zwracania złego statusu na stronie tickets.opscode.com/browse/COOK-334 . Jednak moje pytanie dotyczy tego, czy istnieje sposób zmusić szefa kuchni do wydania polecenia uruchomienia usługi, pomijając sprawdzanie statusu. service startjest prawie zawsze idempotentny, więc powinno być dobrze.
Częściowe zachmurzenie
Przepraszamy, błąd to bilety.opscode.com/browse/COOK-3526 .
Częściowe zachmurzenie