Назад | Перейти на главную страницу

Как принудительно выполнить действия на «обновленных» ресурсах в 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?

РЕДАКТИРОВАТЬ: Я подумал, что стоит добавить, что использование модификатора: немедленно приводит к правильному выполнению действия. Однако на практике у меня есть несколько файлов, которые могут вызвать перезапуск, и мне нужно, чтобы все они были обновлены перед перезапуском (именно для этого и предназначено поведение: delayed).

Я использую Chef 10.14.4, и у меня такие же проблемы, как и у вас. Какую версию ты используешь?

Уведомление появляется в файле журнала, как будто оно собирается запустить действие: restart для поставщика supervisor_service:

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).