Chef 按顺序停止和启动服务

Chef 按顺序停止和启动服务

我的食谱中有以下内容

service "apache" do
  action :stop
end

# Do something..

service "apache" do
  action :start
end

我发现第二个块没有执行。有什么原因吗?

答案1

服务启动和重启的默认设置是将其全部保存到 chef-client 运行结束。如果您确实希望启动或重启两次服务,请指定它们将立即发生:

service "apache" do 
  action :start, :immediately
end

这样做通常不是一个好主意,因为多次重启可能会导致不必要的服务中断。这就是为什么 Chef 会尝试将所有服务重启都保存到运行结束时。

答案2

通知是处理此问题的正确方法。

假设您要执行以下操作:

  • 有条件地下载文件
  • 如果文件已下载
    • 立即停止 Apache
    • 处理文件(例如解压缩或移动它)
    • 再次启动 Apache

你可以这样做:

# Define the apache service but don't do anything with it
service "apache" do
  action :nothing
end

# Define your post-fetch script but don't actually do it
execute "process my file" do
   ... your code here
  action :nothing
  notifies :start, "service[apache]"
end

# Fetch the file. Maybe the file won't be fetched because of not_if or checksum.
# In that case apache won't be stopped or started, it will just keep running.
remote_file "/tmp/myfile" do
  source "http://fileserver/myfile"
  notifies :stop, "service[apache]", :immediately
  notifies :run, execute["process my file"]
end

答案3

问题是您的资源有相同的名称。服务“apache”不是唯一的,因此 chef 会删除重复项。您可以选择为它们赋予不同的名称,如下所示

service "apache stop" do
  service_name "apache"
  action :stop
end

# Do something

service "apache start" do
  service_name "apache"
  action :start
end

您还可以使用“# Do something”块中的通知向服务“apache”发送 :restart。这是人们通常使用的模式,单个服务,向其发送通知(或使用订阅)。更多信息请见此处:

http://wiki.opscode.com/display/chef/Resources#Resources-Notifications

答案4

Mray 和 kgilpin 的答案很完美,但我最近遇到了问题。

不知何故,mysql 服务在我需要重新启动它之前没有停止,因此我的配方失败了。我使用了使用 '''Execute''' 资源的解决方法(我只需要在 Ubuntu 上运行的配方)。Execute 正在等待停止/启动,而服务可以更早结束(初始化脚本将完成,而守护进程不会)

执行“停止服务”
   命令“服务停止”
结尾

我对这个解决方案并不感到自豪,但它对我来说还是有用的。

相关内容