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

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...