パペットのサービスにカスタムステータスコマンドを使用するにはどうすればよいですか?


10

私は、バックポートからPostgreSQL 9.1でdebian squeezeを使用しています。Puppetのバージョンは2.7.14です。残念ながら、initスクリプトはステータスに対して間違った終了コードを返します。したがって、statuspostgresqlが実行されているかどうかを検出するカスタムコマンドを作成しました。

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

私のコマンドはチャームのように機能しますが、人形には問題があるようです。notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'既に動いているのにいつもゲット。

したがって、次のことを試しました:

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

このカスタムstatusコマンドを理解したので、puppetは常にpostgresqlが実行されていると考えるべきです。それにもかかわらず、人形は毎回postgresqlを起動しようとします。

私のせいは何ですか?それとも人形のバグですか?


マニフェストは正しいように見えるので、これはPuppetのバグのように聞こえます。長いショットですが、設定してみてくださいprovider => init(そしてenableパラメーターを削除してください)。
mgorven

2
exit 0は有効なコマンドですか?通常、exitコマンドはシェルの内部にあります。あなたはbash -c 'exit 0'のようなことをする必要がありますか?
Zoredache

@Zoredacheあなたは正しい。sh -c 'exit 0'を使用するとstatus、puppet のコマンドは期待どおりに機能します。
MMore

回答:


6

私の推測では$4、コマンドのはパペット自身の補間によって飲み込まれており、exit 0シェルの相互作用の問題のために正しく動作しないと思います。

私はいくつかのことを試みます。

  1. $4コマンドでのパペットの補間が問題である場合は、次の$ように エスケープしますstatus => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(バックスラッシュがさらに必要な場合がありますが、ここでは1で十分です)。
  2. テストコマンドが実際に正しく機能していることを確認します。exitシェル内部であり、パペットがそれをどのように処理するかはわかりません。代わりに、正規の「return success」コマンドを使用してください。status => "/bin/true"
  3. 多分statusによって上書きされているprovider => debianので、代わりにすべてのコマンドを指定し、(これはしかし、適切に有効にしません)ベースのプロバイダを使用し、(人形のバグであろう):

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

もう1つ:execタイプと同様に、人形には実行可能ファイルへのフルパスが必要だと思います。statusグローバルに設定していない場合は、それらを行のフルパスに設定してみてください。
シェーンマデン

@ShaneMadden:Puppetは、コマンドへのフルパスを必ずしも必要とはしませんが、コマンドが必要であると仮定しても何も害はありません。ある種のデフォルトパス(環境デーモンのPATHが開始されたか?)に加えexecて、pathパラメーターを受け入れ、Exec { path => '/usr/bin:/bin' }またはでデフォルトパスを設定できますExec { path => ['/usr/bin'],['/bin']}。サービスにも同様の「パス」がありますが、それは通常のシェルスタイルのコマンド検索パスとしてではなく、initスクリプトを見つけるために特定のプロバイダーで主に使用されているようです。
フライハイト

1
ありがとう!の補間が$4問題でした。私はそれを交換しましたが\$4、今ではすべてが期待どおりに動作します:)
MMore
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.