Come utilizzare un comando di stato personalizzato per un servizio in pupazzo?


10

Sto usando la compressione debian con PostgreSQL 9.1 dai backport. Puppet ha la versione 2.7.14. Sfortunatamente lo script init restituisce il codice di uscita errato per lo stato. Pertanto ho scritto un statuscomando personalizzato per rilevare se postgresql è in esecuzione o meno.

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,
}

Il mio comando funziona come un incantesimo, ma il burattino sembra avere un problema. Ricevo sempre notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'anche se è già in esecuzione.

Quindi ho provato quanto segue:

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

Come ho capito questo statuscomando personalizzato , Puppet dovrebbe sempre pensare che Postgresql sia in esecuzione. Tuttavia il burattino cerca di avviare postgresql - ogni volta.

Qual è la mia colpa? O è un bug nel burattino?


Il tuo manifest sembra corretto, quindi questo sembra un bug in Puppet. È un tiro lungo, ma prova a impostare provider => init(e rimuovi il enableparametro).
mgorven

2
Sei sicuro che l'uscita 0 sia un comando valido? Il comando exit è generalmente interno a una shell. Devi fare qualcosa come bash -c 'exit 0'?
Zoredache,

@Zoredache hai ragione. Con sh -c 'exit 0' il statuscomando di puppet funziona come previsto!
MMore

Risposte:


6

La mia ipotesi migliore è che il $4tuo comando venga inghiottito dalla stessa interpolazione del burattino e che exit 0non funziona bene a causa di problemi di interazione della shell.

Vorrei provare alcune cose.

  1. Se il problema è che l'interpolazione fantoccio è attiva $4nel tuo comando, scappa $così: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(a volte sono necessarie più barre rovesciate, ma sono abbastanza sicuro che qui sia sufficiente 1).
  2. Assicurati che il comando test funzioni davvero bene. exitè un guscio interno e non sono sicuro di come lo faranno le marionette. Usa invece il comando canonico "return success":status => "/bin/true"
  3. Forse statusviene sovrascritto da provider => debian(che sarebbe un bug fantoccio), quindi specifica tutti i comandi e usa il provider di base (questo non si abiliterà correttamente, tuttavia):

    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 }'",
    }
    

Un'altra cosa: simile al exectipo, penso che il burattino abbia bisogno di percorsi completi per gli eseguibili. Prova a impostarli sul percorso completo della tua statuslinea, se non ne hai impostato uno a livello globale?
Shane Madden,

@ShaneMadden: Puppet non ha necessariamente bisogno di percorsi completi per i comandi, anche se supporre che ne abbia bisogno non fa male a nulla. Oltre a una sorta di percorso predefinito (PATH in daemon ambiente è stato avviato in?) execAccetta un pathparametro e puoi impostare un percorso predefinito con Exec { path => '/usr/bin:/bin' }o Exec { path => ['/usr/bin'],['/bin']}. Esiste un "percorso" simile sul Servizio, ma sembra essere utilizzato principalmente con alcuni provider per trovare script di init, piuttosto che come un normale percorso di ricerca dei comandi in stile shell.
Freiheit,

1
Grazie! L'interpolazione di $4era il problema. L'ho sostituito con \$4e ora tutto funziona come previsto :)
MMore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.