如何在 Puppet 中使用自定义服务状态命令?

如何在 Puppet 中使用自定义服务状态命令?

我正在使用 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 交互问题而无法正常工作。

我会尝试一些事情。

  1. 如果问题出$4在您的命令中 puppet 的插值,请$像这样转义:( status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"有时需要更多反斜杠,但我很确定 1 个就足够了)。
  2. 确保测试命令确实正常工作。exit是 shell 内部,我不确定 puppet 将如何处理它。因此,请使用规范的“返回成功”命令:status => "/bin/true"
  3. 可能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 }'",
    }
    

相关内容