我正在编写一个Puppet模块来部署Hyperic,如果服务没有运行,最后一部分正在执行hq-agent.sh start。要确定服务是否正在运行,我可以执行hq-agent.sh状态,其中包含文本“HQ代理正在运行”。
Puppet文档声明只有if可以工作,但是如果运行则需要返回退出代码1,如果没有运行则返回0;什么是适用的bash(?)命令进行转换?
伪代码=> if('hq-agent.sh status'包含“running”)返回1;否则返回0;
这听起来非常像应该通过Service
资源建模的东西,而不是Exec
。这样做不需要通过系统的常规服务控制子系统(initscripts,systemd,...)来管理服务,但我肯定会建议安排它,即使你必须自己编写适当的脚本或配置文件。然而,在这种情况下,hq-agent.sh
脚本听起来像是有一个类似于传统脚本的接口,如果不相同的话。如果是这样,那么将其设置为普通的系统服务可能非常容易。如果你这样做,那么管理就可以了
service { 'hq-agent':
ensure => 'running',
enable => true,
}
但是,如果您只是想使用临时脚本来管理服务,Puppet可以支持它。具体来说,the Service
resource具有start
,restart
,status
和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
}
该特定示例基于其与标准SysV initscript的表面相似性,对hq-agent.sh
脚本的退出代码做出一些假设。具体来说,它假设它们符合LSB specifications。如果它们实际上没有,那么您需要测试脚本的输出而不是其退出代码,那么典型的方法是将输出管道输入grep
。例如,
status => 'hq-agent.sh status | grep -q running'
但请注意,您可能需要测试脚本的标准错误而不是标准输出。