在下面的代码中,我创建了一个服务,我希望该服务仅在部署它所依赖的文件后启动,并在这些文件发生更改时重新启动它。这个非常基本的配方并没有像我预期的那样工作:
supervisor_service "test-service" do
command "/bin/cat"
autostart false
action :enable
end
cookbook_file "/tmp/test.txt" do
source "test.txt"
notifies :restart, 'supervisor_service[test-service]'
end
运行结束时,chef-client 仅记录:
- Supervisor_service[test-service] 操作重启 (最新)
...服务未运行。手册sudo supervisorctl restart test-service
很好用。
就我而言,重启操作是请求资源改变状态(启用->已启动),向 Chef 表达这一点的正确方法是什么?
编辑: 我认为值得补充的是,使用 :immediately 修饰符可使操作正确执行。然而,实际上我有多个文件可能会触发重启,我需要在重启之前更新所有文件(这正是 :delayed 的行为所要提供的)。
答案1
我使用的是 Chef 10.14.4,遇到了和你一样的问题。你使用的是哪个版本?
通知确实出现在日志文件中,就好像它即将在supervisor_service提供程序上运行:restart操作:
INFO: cookbook_file[/tmp/test.txt] sending restart action to supervisor_service[test-service] (delayed)
INFO: Processing supervisor_service[test-service] action restart (temp::default line 16)
但我们得到的只是:
INFO: Chef Run complete in 14.302624 seconds
与此同时,我能做的最好的工作是:
supervisor_service "test-service" do
command "/bin/cat"
autostart false
action :enable
end
execute "restart test-service" do
command "supervisorctl restart test-service"
user "root"
action :nothing
end
cookbook_file "/tmp/test.txt" do
source "test.txt"
notifies :run, "execute[restart test-service]"
end
这本质上是完全相同的代码,需要运行,但是却无法运行。
由于这可以正常工作,但通知supervisor_service提供程序却不行,因此只能假设存在一个错误这个文件在主管手册(v0.4.0)中。