如何强制对 Chef 中的“最新”资源采取行动?

如何强制对 Chef 中的“最新”资源采取行动?

在下面的代码中,我创建了一个服务,我希望该服务仅在部署它所依赖的文件后启动,并在这些文件发生更改时重新启动它。这个非常基本的配方并没有像我预期的那样工作:

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)中。

相关内容