Debian
如何為 puppet 中的服務使用自定義狀態命令?
我正在使用來自 backports 的 PostgreSQL 9.1 的 debian 擠壓。Puppet 的版本為 2.7.14。不幸的是,init 腳本返回了錯誤的狀態退出程式碼。因此,我編寫了一個自定義
status
命令來檢測 postgresql 是否正在執行。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, }
我的命令就像一個魅力,但 puppet 似乎有問題。
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 正在執行。儘管如此,puppet 每次都嘗試啟動 postgresql。我的錯是什麼?或者它是傀儡中的一個錯誤?
我最好的猜測是,
$4
您的命令中的 被 puppet 自己的插值所吞噬,並且exit 0
由於 shell 互動問題而無法正常工作。我會嘗試一些事情。
- 如果問題是
$4
您的命令中 puppet 的插值轉義,則$
如下所示:(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
(這將是一個 puppet 錯誤),因此請指定所有命令並使用基本提供程序(但是,這不會正確啟用):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 }'", }