![Chef 按顺序停止和启动服务](https://linux22.com/image/581207/Chef%20%E6%8C%89%E9%A1%BA%E5%BA%8F%E5%81%9C%E6%AD%A2%E5%92%8C%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1.png)
我的食谱中有以下内容
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 正在等待停止/启动,而服务可以更早结束(初始化脚本将完成,而守护进程不会)
执行“停止服务” 命令“服务停止” 结尾
我对这个解决方案并不感到自豪,但它对我来说还是有用的。