service "postgresql" do action :start end
但它没有效果,说(最新)大概是因为厨师知道它已经开始并且无法判断它已经停止了. (可能是因为服务……状态如何适用于此服务?)如果我这样写:
# anti-pattern warning! execute "force-start-postgresql" do command "service postgresql start || /etc/init.d/postgresql start" action :run end
我得到了理想的行为.还有一个动作:restart使它运行.然而,由于便携性,这些似乎是反模式(并且在后一种情况下再次启动之前可能会停止它).
那么,我怎么能告诉Chef强行启动服务,即使它认为它已经运行了?
这是使用由OpsCode托管的Chef 11.6和默认的postgresql配方. (注意这是类似的,但我认为与How to force actions on “up to date” resources in Chef?不完全相同.)
—编辑(jtimberland帖子后的澄清)—
这里的-l调试显示:
DEBUG: service[postgresql] supports status,running DEBUG: service[postgresql] is running
即使它没有运行.所以这听起来像一个bug,我对此感兴趣.但是我主要想知道是否有办法告诉Chef“总是调用服务启动命令,跳过状态检查”.这就是问题所在.
(我不是专家,但我认为确保服务正在运行的最便携方式是启动服务,这几乎总是幂等.OTOH检查服务是否运行不太一致,我不明白为什么我们应该关心!)
它如何确定服务正在运行取决于.
默认情况下,Chef将尝试使用ps匹配进程表中的服务名称(此处为postgresql).
ps -ef | grep postgresql
实质上.检查进程表时,服务名称将用于模式匹配.这可能是你想要/不需要的,特别是取决于平台以及它如何命名“postgresql”服务.
但是,您可以告诉Chef该服务支持“status”命令,这意味着Chef通常会执行类似的操作,
/etc/init.d/postgresql status
并使用返回代码来确定它是否正在运行(非零未运行).
默认情况下,Chef不会这样做,因为并非所有服务脚本都支持状态命令(令人沮丧),而且Chef天生就不知道正确的做法是什么.它试图做出理智的默认事情,但有时天真.因此,您可以告诉Chef该资源具有状态命令而不是那么天真.
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
您也可以通过运行带调试输出的Chef来更详细地了解正在发生的事情:
chef-client -l debug