postgresql – 如何确保服务正在运行,使用Chef?
我的情况是Chef可能会开始服务(postgres),但随后可能会在带外停止.我想要一个后续的Chef运行来使服务运行.我试过这个:
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将检查服务是否正在运行,如果服务未运行则启动它.
它如何确定服务正在运行取决于. 默认情况下,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |