微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/postgresql/192521.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐