Bagaimana cara menggunakan perintah status khusus untuk layanan di boneka?

10

Saya menggunakan debian squeeze dengan PostgreSQL 9.1 dari backports. Wayang memiliki versi 2.7.14. Sayangnya skrip init mengembalikan kode keluar yang salah untuk status. Karena itu saya menulis statusperintah khusus untuk mendeteksi apakah postgresql berjalan atau tidak.

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

Perintah saya bekerja seperti mantra, tetapi wayang tampaknya memiliki masalah. Saya selalu mendapatkan notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'meskipun sudah berjalan.

Jadi coba yang berikut ini:

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

Seperti yang saya pahami statusperintah khusus ini , boneka harus selalu berpikir bahwa postgresql sedang berjalan. Namun demikian wayang mencoba memulai postgresql - setiap saat.

Apa kesalahanku? Atau itu bug di boneka?

Lebih lagi
sumber
Manifes Anda terlihat benar, jadi ini terdengar seperti bug di Wayang. Ini pukulan panjang, tetapi cobalah mengatur provider => init(dan menghapus enableparameter).
Mgorven
2
Apakah Anda yakin keluar 0 adalah perintah yang valid? Perintah keluar biasanya internal ke shell. Apakah Anda perlu melakukan sesuatu seperti bash -c 'exit 0'?
Zoredache
@Zoredache Anda benar. Dengan sh -c 'exit 0' statusperintah wayang bekerja seperti yang diharapkan!
MMore

Jawaban:

6

Dugaan terbaik saya adalah bahwa $4perintah Anda sedang ditelan oleh interpolasi boneka itu sendiri dan itu exit 0tidak berfungsi dengan baik karena masalah interaksi shell.

Saya akan mencoba beberapa hal.

  1. Jika masalahnya adalah interpolasi boneka di $4dalam perintah Anda lolos $seperti itu: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(kadang-kadang lebih banyak backslash diperlukan, tapi saya cukup yakin 1 sudah cukup di sini).
  2. Pastikan perintah tes benar-benar berfungsi dengan baik. exitadalah cangkang internal dan saya tidak yakin bagaimana boneka akan memperlakukan itu. Jadi gunakan perintah kan "kembali sukses" sebagai gantinya:status => "/bin/true"
  3. Mungkin statussedang ditimpa oleh provider => debian(yang akan menjadi bug boneka), jadi alih-alih tentukan semua perintah dan gunakan penyedia basis (namun, ini tidak memungkinkan dengan benar):

    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
sumber
Satu hal lagi: mirip dengan exectipenya, saya pikir wayang membutuhkan jalur penuh ke executable. Coba atur itu ke jalur lengkap di statusbaris Anda , jika Anda belum menetapkannya secara global?
Shane Madden
@ShaneMadden: Wayang tidak perlu memerlukan path lengkap ke perintah, meskipun dengan asumsi dibutuhkan mereka tidak melukai apa pun. Selain semacam jalur default (PATH di daemon lingkungan dimulai?) execMenerima pathparam dan Anda dapat mengatur jalur default dengan Exec { path => '/usr/bin:/bin' }atau Exec { path => ['/usr/bin'],['/bin']}. Ada 'jalur' serupa pada Layanan, tetapi tampaknya terutama digunakan dengan penyedia tertentu untuk menemukan skrip init, alih-alih sebagai jalur pencarian perintah shell-style normal.
freiheit
1
Terima kasih! Interpolasi $4adalah masalahnya. Saya menggantinya dengan \$4dan sekarang semuanya berfungsi seperti yang diharapkan :)
MMore