我正在使用 debian squeeze 和从 backports 移植的 PostgreSQL 9.1。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。
这是我的错吗?还是 Puppet 出了问题?
答案1
我最好的猜测是,$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
是 shell 内部,我不确定 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 }'", }