如何确保服务正在运行,使用厨师?

我正处于厨师可能开始服务(postgres)的情况,但可能会随后停止带外服务。 我想要一个后续的厨师运行,导致该服务正在运行。 我试过这个:

service "postgresql" do action :start end 

但是这并没有影响,据说(up to date)大概是因为厨师知道它已经启动了,并且不能够说明它已经停止了。 (可能是由于service ... status如何performance这个服务?)如果我写这个:

 # anti-pattern warning! execute "force-start-postgresql" do command "service postgresql start || /etc/init.d/postgresql start" action :run end 

我得到所需的行为。 还有一个action :restart使其运行。 然而,由于可移植性,这些看起来像反模式(并且在后一种情况下再次启动之前可能会阻止它)。

那么,我怎么能告诉厨师强行启动服务,即使它认为它已经在运行?

这是使用由OpsCode托pipe的Chef 11.6和默认的postgresql配方。 (请注意,这是相似的,但我觉得不像Chef中的“最新”资源强制操作一样)

编辑 (澄清后jtimberland后)—

这里的-l debug显示:

 DEBUG: service[postgresql] supports status, running DEBUG: service[postgresql] is running 

即使它没有运行。 所以这听起来像一个错误,我对此感兴趣。 然而,我主要感兴趣的是是否有办法告诉厨师“总是调用服务启动命令,跳过状态检查”。 这是这里的问题。

(我不是专家,但我认为确保服务最便捷的方法就是启动服务,而且这几乎总是幂等的。OTOH 检查服务是否运行不太一致,我不明白为什么我们应该关心!)

默认情况下,Chef将检查服务是否正在运行,如果服务没有运行,则启动它。

它如何确定服务正在运行取决于。

默认情况下,Chef会尝试使用ps来匹配进程表中服务的名称( postgresql )。

 ps -ef | grep postgresql 

本质。 检查进程表时,服务的名称将用于模式匹配。 这可能是也可能不是你想要/需要的,特别是取决于平台以及它如何命名“postgresql”服务。

但是,您可以告诉厨师,该服务支持“状态”命令,这意味着厨师通常会做类似的事情,

 /etc/init.d/postgresql status 

并使用返回码来确定它是否正在运行(非零不运行)。

厨师不会默认这样做,因为并不是所有的服务脚本都支持状态命令(令人沮丧的是),厨师也不会天生就知道正确的做法。 它试图做的理智默认的事情,但有时是天真的。 因此,你可以告诉厨师资源有一个状态命令,而不是太天真。

 service "postgresql" do supports :status => true action :start end 

现在,如果该服务实际上并不是名为“postgresql”,而是“postgresql-92”或类似的,你可以这样做:

 service "postgresql-92" do supports :status => true action :start end 

要么

 service "postgresql" do service_name "postgresql-92" supports :status => true action :start end 

通过运行带有debugging输出的厨师,您也可以更详细地了解发生了什么事情:

 chef-client -l debug