Debian

如何為 puppet 中的服務使用自定義狀態命令?

  • May 15, 2012

我正在使用來自 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 互動問題而無法正常工作。

我會嘗試一些事情。

  1. 如果問題是$4您的命令中 puppet 的插值轉義,則$如下所示:( status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"有時需要更多的反斜杠,但我很確定 1 在這裡就足夠了)。
  2. 確保測試命令確實正常工作。exit是一個內部外殼,我不確定 puppet 會如何處理它。因此,請改用規範的“返回成功”命令:status => "/bin/true"
  3. 也許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 }'",
}

引用自:https://serverfault.com/questions/389361