Jak użyć niestandardowego polecenia statusu dla usługi w marionetce?

10

Używam ściśnięcia Debiana z PostgreSQL 9.1 z backportów. Puppet ma wersję 2.7.14. Niestety skrypt inicjujący zwraca zły kod wyjścia dla statusu. Dlatego napisałem niestandardowe statuspolecenie, aby wykryć, czy postgresql działa, czy nie.

service { 'postgresql':
  ensure => running,
  enable => true,
  hasstatus  => false,
  hasrestart => true,
  status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if ($4 != \"online\") rc=3} END { exit rc }'",
  provider => debian,
}

Moje polecenie działa jak czar, ale wydaje się, że marionetka ma problem. Zawsze dostaję, notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'chociaż już działa.

Więc wypróbowałem następujące:

service { 'postgresql':
  ensure => running,
  enable => true,
  hasstatus  => false,
  hasrestart => true,
  status => "exit 0",
  provider => debian,
}

Jak rozumiem to niestandardowe statuspolecenie, marionetka powinna zawsze myśleć, że działa postgresql. Niemniej jednak marionetka próbuje za każdym razem rozpocząć postgresql.

Co jest moją winą? Czy jest to błąd w marionetce?

MMore
źródło
Twój manifest wygląda poprawnie, więc brzmi to jak błąd w Marionetce. To dalekie ujęcie, ale spróbuj ustawić provider => init(i usunąć enableparametr).
mgorven
2
Czy na pewno wyjście 0 jest prawidłowym poleceniem? Komenda wyjścia jest zwykle wewnętrzna dla powłoki. Czy musisz zrobić coś takiego jak bash -c 'exit 0'?
Zoredache
@Zoredache masz rację. Z sh -c 'exit 0' statuspolecenie kukiełki działa zgodnie z oczekiwaniami!
MM Więcej

Odpowiedzi:

6

Moje najlepsze przypuszczenia to to, że $4twój dowódca zostaje pochłonięty przez własną interpolację marionetki i exit 0to nie działa właściwie z powodu problemów z interakcją powłoki.

Spróbowałbym kilku rzeczy.

  1. Jeśli problemem jest interpolacja lalek $4w twoim poleceniu, uciekaj $tak: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(czasem potrzeba więcej odwrotnych ukośników, ale jestem prawie pewien, że tutaj 1 wystarczy).
  2. Upewnij się, że polecenie testowe naprawdę działa poprawnie. exitjest wewnętrzną powłoką i nie jestem pewien, jak potraktuje to marionetka. Zamiast tego użyj kanonicznego polecenia „powróć do sukcesu”:status => "/bin/true"
  3. Być może statusjest to nadpisywane provider => debian(co byłoby marionetkowym błędem), więc zamiast tego podaj wszystkie polecenia i użyj podstawowego dostawcy (to jednak nie włączy się poprawnie):

    service { 'postgresql':
      provider => base,
      ensure   => 'running',
      start    => '/etc/init.d/postgresql start',
      restart  => '/etc/init.d/postgresql restart',
      stop     => '/etc/init.d/postgresql stop',
      status   => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'",
    }
    
freiheit
źródło
Jeszcze jedno: podobnie jak exectyp, myślę, że marionetka potrzebuje pełnych ścieżek do plików wykonywalnych. Spróbuj ustawić je na pełną ścieżkę w statuslinii, jeśli nie ustawiłeś jej globalnie?
Shane Madden
@ShaneMadden: Puppet niekoniecznie potrzebuje pełnych ścieżek do poleceń, ale zakładanie, że ich potrzebuje, niczego nie rani. Oprócz domyślnej ścieżki (PATH w środowisku uruchomiono demona?) execAkceptuje pathparametr i możesz ustawić domyślną ścieżkę za pomocą Exec { path => '/usr/bin:/bin' }lub Exec { path => ['/usr/bin'],['/bin']}. Usługa ma podobną „ścieżkę”, ale wydaje się, że jest używana przede wszystkim u niektórych dostawców do wyszukiwania skryptów inicjujących, a nie jako zwykłą ścieżkę wyszukiwania poleceń w stylu powłoki.
freiheit
1
Dzięki! $4Problemem była interpolacja . Zastąpiłem go \$4i teraz wszystko działa zgodnie z oczekiwaniami :)
Więcej