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

MMo*_*ore 10 postgresql debian puppet debian-squeeze

我正在使用来自 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,
}
Run Code Online (Sandbox Code Playgroud)

我的命令像魔法一样有效,但 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,
}
Run Code Online (Sandbox Code Playgroud)

据我了解这个自定义status命令,puppet 应该始终认为 postgresql 正在运行。尽管如此,puppet 每次都尝试启动 postgresql。

我的错是什么?还是人偶的bug?

fre*_*eit 6

我最好的猜测是,$4您的命令中的 被 puppet 自己的插值所吞噬,exit 0并且由于 shell 交互问题而无法正常工作。

我会尝试一些事情。

  1. 如果问题是 puppet$4在您的命令中的插值,请$像这样:( 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(这将是一个傀儡错误),所以改为指定所有命令并使用基本提供程序(但是这将无法正确启用):

    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 }'",
    }
    
    Run Code Online (Sandbox Code Playgroud)