web-dev-qa-db-ja.com

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

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

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を起動しようとします。

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

10
MMore

私の推測では、コマンドの$4はパペット自身の補間によって飲み込まれており、シェルの相互作用の問題によりexit 0は正しく機能しません。

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

  1. コマンドの$4に対するパペットの補間に問題がある場合は、$を次のようにエスケープします:status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(バックスラッシュがさらに必要な場合がありますが、ここでは1で十分です)。
  2. テストコマンドが実際に正しく機能していることを確認します。 exitはシェル内部であり、puppetがそれをどのように扱うかわかりません。代わりに、正規の「成功を返す」コマンドを使用してください:status => "/bin/true"
  3. 多分statusprovider => 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 }'",
    }
    
6
freiheit