您如何配置Puppet exec以作为Onlyif的一部分执行另一个命令

时间:2018-09-12 18:47:10

标签: bash puppet centos7 hyperic

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

Puppet文档仅规定了可行的条件,但是如果正在运行则需要返回退出代码,如果不运行则需要返回退出代码;否则请返回0。什么是适用的bash(?)命令进行转换?

伪代码=>如果(“ hq-agent.sh状态”包含“正在运行”)返回1;否则返回0;

1 个答案:

答案 0 :(得分:1)

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

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

但是,如果您只想使用 ad hoc 脚本来管理服务,Puppet可以支持该服务。具体来说,the Service resource具有startrestartstatusstop属性,通过它们可以指定用于管理服务的任意命令。例如,

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
}

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

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

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