How to force actions on "up to date" resources in Chef?

In the following code, I create a service that I would like to start only after deploying files that it depends upon, and to restart it whenever those files change. This very basic recipe does not work as I'd expect:

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

At the end of the run, chef-client only logs:

  • supervisor_service[test-service] action restart (up to date)

...and the service is not run. A manual sudo supervisorctl restart test-service works fine.

As far as I'm concerned a restart action is a request for the resource to change state (enabled -> started), what is the correct way to express this to Chef?

EDIT: I thought it would be worth adding that using the :immediately modifier causes the action to execute correctly. However in practice I have multiple files that may trigger a restart, and I need all of them to be updated before restarting (exactly the behaviour :delayed is meant to provide).


Solution 1:

I'm using Chef 10.14.4 and I get the same problems as you. What version are you using?

The notification does appear in the log file, as if it's about to run the :restart action on the supervisor_service provider:

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)

but then we simply get:

INFO: Chef Run complete in 14.302624 seconds

In the mean time, the best I could get working is:

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

which is essentially the exact same code that is meant to run, but doesn't.

Since this works fine, but notifying the supervisor_service provider does not, one can only assume that a bug exists within this file in the supervisor cookbook (v0.4.0).