バックポートから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を起動しようとします。
私のせいは何ですか?それとも人形のバグですか?
私の推測では、コマンドの$4
はパペット自身の補間によって飲み込まれており、シェルの相互作用の問題によりexit 0
は正しく機能しません。
私はいくつかのことを試みます。
$4
に対するパペットの補間に問題がある場合は、$
を次のようにエスケープします:status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"
(バックスラッシュがさらに必要な場合がありますが、ここでは1で十分です)。exit
はシェル内部であり、puppetがそれをどのように扱うかわかりません。代わりに、正規の「成功を返す」コマンドを使用してください:status => "/bin/true"
多分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 }'",
}