我处在Chef可能启动服务(postgres)但后来可能带外停止的情况。我希望随后的Chef运行以使服务运行。我已经试过了:
service "postgresql" do
action :start
end
但这没什么效果,(up to date)
大概是因为Chef知道它已经启动并且无法告诉它已经停止了。(可能是由于service ... status
该服务的行为方式?)如果我这样写:
# anti-pattern warning!
execute "force-start-postgresql" do
command "service postgresql start || /etc/init.d/postgresql start"
action :run
end
我得到了期望的行为。也action :restart
使其运行。但是,由于可移植性,它们看起来像是反模式(在后一种情况下,有可能在再次启动之前将其停止)。
那么,即使我认为该服务已经在运行,我如何告诉Chef强行启动该服务呢?
这使用的是由OpsCode托管的Chef 11.6,以及默认的postgresql配方。(请注意,这是相似的,但我认为与如何在Chef中对“最新”资源强制执行操作并不完全相同。)
--- 编辑(jtimberland发布后的说明)---
在-l debug
这里显示:
DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running
即使它没有运行。所以这听起来像是一个错误,我对此很感兴趣。但是,我主要对是否有一种方法告诉Chef“总是调用服务启动命令,跳过状态检查”感兴趣。这就是这里的问题。
(我不是专家,但我想,以确保服务的最简便的方式在运行时启动该服务,这就是几乎总是幂等。OTOH 检查服务是否正在运行是不太一致,我不明白为什么我们要关心!)
:start
不考虑的:status
。我也希望它做一个ps -ef | grep [p]ostgresql
或类似的例子,否则它通常会匹配自己的grep命令,因此总是认为服务正在运行。(或者这可能是潜在的问题?)