我正处于厨师可能开始服务(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