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


10

我在反向移植中使用PostgreSQL 9.1和debian squeeze。Puppet的版本为2.7.14。不幸的是,初始化脚本返回了错误的状态退出代码。因此,我编写了一个自定义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,
}

我的命令像个魔术师一样工作,但是木偶似乎有问题。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命令使p始终认为postgresql正在运行。然而,木偶每次都尝试启动postgresql。

我怎么了 还是木偶中的错误?


您的清单看起来正确,因此听起来像是Puppet中的错误。这是一个长镜头,但是请尝试设置provider => init(并删除enable参数)。
mgorven 2012年

2
您确定出口0是有效命令吗?exit命令通常在外壳内部。您是否需要执行bash -c'exit 0'之类的操作?
Zoredache

@Zoredache你是对的。使用sh -c'exit 0' status,木偶命令按预期工作!
MMore 2012年

Answers:


6

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

我会尝试一些事情。

  1. 如果问题是$4在命令中插入人偶的内插,请$像这样进行转义:( status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"有时需要更多的反斜杠,但我敢肯定在这里1就足够了)。
  2. 确保测试命令确实正确运行。exit是外壳内部的,我不确定p如何处理。因此,请使用规范的“返回成功”命令:status => "/bin/true"
  3. 可能statusprovider => 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 }'",
    }
    

另一件事:与exec类型类似,我认为p需要可执行文件的完整路径。status如果尚未全局设置,则尝试将其设置为行中的完整路径吗?
Shane Madden

@ShaneMadden:Puppet不一定需要完整的命令路径,尽管假设需要它们也不会造成任何伤害。除了某种默认路径(环境守护进程中的PATH是在其中启动的?)之外,还exec接受一个path参数,您可以使用Exec { path => '/usr/bin:/bin' }或设置默认路径Exec { path => ['/usr/bin'],['/bin']}。Service上也有类似的“路径”,但它似乎主要用于某些提供程序来查找初始化脚本,而不是用作常规的shell样式命令搜索路径。
2012年

1
谢谢!$4问题是插值。我将其替换为\$4,现在一切都按预期进行了:)
MMore 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.