如何使用 Chef 确保服务正在运行?

Par*_*udy 10 postgresql service chef

我的情况是,Chef 可能会启动一项服务 (postgres),但随后可能会在带外停止。我想要一个后续的 Chef 运行来导致服务运行。我试过这个:

service "postgresql" do
    action :start
end
Run Code Online (Sandbox Code Playgroud)

但它没有效果,(up to date)大概是因为 Chef 知道它已经启动并且无法判断它已经停止。(可能是由于service ... status此服务的行为方式?)如果我这样写:

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end
Run Code Online (Sandbox Code Playgroud)

我得到了想要的行为。也action :restart让它运行。然而,由于可移植性,这些看起来像是反模式(并且在后一种情况下可能会在再次启动之前停止它)。

那么,我如何告诉 Chef 强制启动该服务,即使它认为它已经在运行呢?

这是使用由 OpsCode 托管的 Chef 11.6 和默认的 postgresql 配方。(注意这很相似,但我认为与如何在 Chef 中强制对“最新”资源执行操作不完全相同。)

---编辑(在 jtimberland 帖子后澄清)---

-l debug这里显示:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running
Run Code Online (Sandbox Code Playgroud)

即使它没有运行。所以这听起来像是一个错误,我对此很感兴趣。但是,我主要对是否有办法告诉厨师“始终调用服务启动命令,跳过状态检查”感兴趣。这就是这里的问题。

(我不是专家,但我认为确保服务运行的最便携方法是启动服务,这几乎总是幂等的。OTOH检查服务是否正在运行不太一致,我不明白为什么我们应该关心!)

jti*_*man 11

默认情况下,Chef 将检查服务是否正在运行,如果服务未运行,则启动它。

它如何确定服务正在运行取决于。

默认情况下,Chef 将尝试使用 匹配postgresql进程表中的服务名称(此处)ps

ps -ef | grep postgresql
Run Code Online (Sandbox Code Playgroud)

本质上。检查进程表时,服务的名称将用于模式匹配。这可能是也可能不是您想要/需要的,特别是取决于平台以及它如何命名“postgresql”服务。

但是,您可以告诉 Chef 该服务支持“状态”命令,这意味着 Chef 通常会执行以下操作:

/etc/init.d/postgresql status
Run Code Online (Sandbox Code Playgroud)

并使用返回码来确定它是否正在运行(非零不运行)。

默认情况下,Chef 不会这样做,因为并非所有服务脚本都支持状态命令(令人沮丧),而且 Chef 天生不知道该做什么是正确的。它试图做理智的默认事情,但有时很天真。因此,您可以告诉 Chef 资源具有状态命令,而不是那么天真。

service "postgresql" do
  supports :status => true
  action :start
end
Run Code Online (Sandbox Code Playgroud)

现在,如果服务实际上没有被命名为“postgresql”,而是“postgresql-92”或类似的,你可以这样做:

service "postgresql-92" do
  supports :status => true
  action :start
end
Run Code Online (Sandbox Code Playgroud)

或者

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end
Run Code Online (Sandbox Code Playgroud)

您也可以通过运行带有调试输出的厨师来更详细地了解正在发生的事情:

chef-client -l debug
Run Code Online (Sandbox Code Playgroud)