Kukladaki bir hizmet için özel durum komutu nasıl kullanılır?


10

Backports PostgreSQL 9.1 ile debian sıkmak kullanıyorum. Kukla 2.7.14 sürümüne sahiptir. Ne yazık ki, init betiği durum için yanlış çıkış kodunu döndürür. Bu nedenle statuspostgresql'in çalışıp çalışmadığını tespit etmek için özel bir komut yazdım .

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

Komutum bir charme gibi çalışıyor, ancak kukla bir sorun var gibi görünüyor. Her zaman notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'zaten çalışıyor olmasına rağmen alıyorum .

Bu yüzden aşağıdakileri denedim:

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

Bu özel statuskomutu anladığım gibi , kukla her zaman postgresql'in çalıştığını düşünmelidir. Bununla birlikte, kukla postgresql'yi her zaman başlatmaya çalışır.

Hatam ne? Yoksa kuklada bir böcek mi?


Manifestiniz doğru görünüyor, bu yüzden bu Kukla'da bir hata gibi görünüyor. Bu uzun bir çekimdir, ancak ayarlamayı deneyin provider => init(ve enableparametreyi kaldırın ).
mgorven

2
0 çıkışının geçerli bir komut olduğundan emin misiniz? Çıkış komutu genellikle bir kabuğun içindedir. Bash -c 'exit 0' gibi bir şey yapmanız gerekiyor mu?
Zoredache

@Zoredache haklısın. Sh -c 'exit 0' statusile kukla komutu beklendiği gibi çalışır!
MMore

Yanıtlar:


6

En iyi tahminim, $4komutunuzdaki kuklanın kendi enterpolasyonu tarafından yutulması ve exit 0kabuk etkileşimi sorunları nedeniyle tam olarak çalışmadığıdır.

Birkaç şey denerdim.

  1. Sorun kuklanın enterpolasyonu $4komutunuzda olduğu $gibi kaçarsa: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(bazen daha fazla ters eğik çizgi gerekir, ancak burada 1'in yeterli olduğundan eminim).
  2. Test komutunun gerçekten doğru çalıştığından emin olun. exitbir iç kabuk ve kukla buna nasıl davranacağından emin değilim. Bunun yerine kurallı "dönüş başarılı" komutunu kullanın:status => "/bin/true"
  3. Belki statusgeçersiz kılınıyor provider => debian(bir kukla hatası olurdu), bunun yerine tüm komutları belirtin ve temel sağlayıcıyı kullanın (ancak bu düzgün bir şekilde etkinleştirilmez):

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

Bir şey daha var: exectipine benzer şekilde, kuklaların yürütülebilir dosyalara tam yollara ihtiyacı olduğunu düşünüyorum. statusGlobal olarak belirlemediyseniz bunları çizginizdeki tam yola ayarlamayı deneyin ?
Shane Madden

@ShaneMadden: Kukla, komutlar için tam yollara ihtiyaç duymaz, ancak onlara ihtiyaç duyduklarını varsaymak hiçbir şeye zarar vermez. Bir çeşit varsayılan yola ek olarak (ortam daemon içinde PATH başlatıldı?) execBir pathparam kabul eder ve Exec { path => '/usr/bin:/bin' }veya ile varsayılan bir yol ayarlayabilirsiniz Exec { path => ['/usr/bin'],['/bin']}. Hizmette benzer bir 'yol' var, ancak normal olarak kabuk tarzı komut arama yolu yerine, init komut dosyalarını bulmak için öncelikle belirli sağlayıcılarla kullanılıyor gibi görünüyor.
freiheit

1
Teşekkürler! İnterpolasyon $4problemdi. Ben ile değiştirdiğini \$4ve şimdi her şey olarak :) beklenen işleri
mmore
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.