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


10

我处在Chef可能启动服务(postgres)但后来可能带外停止的情况。我希望随后的Chef运行以使服务运行。我已经试过了:

service "postgresql" do
    action :start
end

但这没什么效果,(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

我得到了期望的行为。也action :restart使其运行。但是,由于可移植性,它们看起来像是反模式(在后一种情况下,有可能在再次启动之前将其停止)。

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

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

--- 编辑(jtimberland发布后的说明)---

-l debug这里显示:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

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

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

Answers:


11

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

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

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

ps -ef | grep postgresql

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

但是,您可以告诉Chef该服务支持“状态”命令,这意味着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

这很有用,但不能完全回答问题。我想告诉它:start 不考虑:status。我也希望它做一个ps -ef | grep [p]ostgresql或类似的例子,否则它通常会匹配自己的grep命令,因此总是认为服务正在运行。(或者这可能是潜在的问题?)
部分多云

在我看来,Chef中存在错误,或者系统上有问题。您正在运行什么平台/ platform_version?您是如何安装postgresql的?包装,货源?
jtimberman

首先,Chef采取幂等操作来管理以声明方式定义的资源。确保带有Chef的服务正在运行的方式是将启动操作发送到该服务。如果没有发生,则可能是Chef中的错误,配方中的错误或系统上的错误。
jtimberman

谢谢@jtimberman。我打开了一个错误的错误状态,该错误状态可在tickets.opscode.com/browse/COOK-334中返回。但是,我的问题是,是否有一种方法可以强制厨师发出service-start命令,从而跳过状态检查。service start几乎总是幂等的,所以应该没问题。
2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.