0

我正在编写一个 Puppet 模块来部署 Hyperic,如果服务没有运行,最后一部分是执行hq-agent.sh start 。要确定服务是否正在运行,我可以执行hq-agent.sh status,其中包含文本“HQ Agent 正在运行”。

Puppet 文档声明 onlyif 可以工作,但是如果正在运行则需要返回退出代码 1,如果不运行则需要返回 0;什么是适用的 bash(?) 命令来进行转换?

伪代码 => if ('hq-agent.sh status' contains "running") return 1; 否则返回 0;

4

1 回答 1

2

这听起来很像应该通过Service资源而不是Exec. 这样做并不需要通过系统的常规服务控制子系统(initscripts、systemd、...)来管理服务,尽管我当然会建议您对此进行安排,即使您必须自己编写适当的脚本或配置文件. 但是,在这种情况下,该hq-agent.sh脚本听起来与传统的 initscript 具有相似的界面,如果不相同的话。如果是这样,那么设置为普通系统服务可能会很容易。如果你这样做了,那么管理它可能就像

service { 'hq-agent':
  ensure => 'running',
  enable => true,
}

但如果您只想使用临时脚本来管理服务,Puppet 可以支持。具体来说,资源Service具有startrestartstatus属性stop,您可以使用这些属性指定用于管理服务的任意命令。例如,

service { 'hq-agent':
  ensure     => 'running',
  provider   => 'service',
  hasstatus  => false,
  hasrestart => false,
  status     => 'hq-agent.sh status',
  start      => 'hq-agent.sh start',
  stop       => 'hq-agent.sh stop',
  path       => '/path/to/hyperic/bin',
  # no 'enable' attribute specified
}

hq-agent.sh该特定示例基于其与标准 SysV initscript 的表面相似性,对脚本的退出代码做出了一些假设。具体来说,它假设它们符合LSB 规范。如果实际上他们没有,那么您需要测试脚本的输出而不是其退出代码,那么典型的方法是将输出通过管道传输到grep. 例如,

  status => 'hq-agent.sh status | grep -q running'

但是请注意,您可能需要测试脚本的标准错误而不是其标准输出。

于 2018-09-12T20:31:46.190 回答