У меня в рецепте есть следующие строчки
service "apache" do
action :stop
end
# Do something..
service "apache" do
action :start
end
Я обнаружил, что 2-й блок не выполняется. Любая причина?
Уведомления - правильный способ справиться с этим.
Предположим, вы хотите сделать следующее:
Вы бы сделали это так:
# 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
Проблема в том, что у ваших ресурсов одно и то же имя. Сервис "apache" не уникален, поэтому шеф-повар их дедуплицирует. Вы можете дать им отдельные имена, как это
service "apache stop" do
service_name "apache"
action :stop
end
# Do something
service "apache start" do
service_name "apache"
action :start
end
вы также можете использовать уведомление из блока «# Сделайте что-нибудь», чтобы отправить: restart службе «apache». Это обычный шаблон, который используют люди: одна услуга, отправка ей уведомлений (или использование подписки). Подробнее здесь:
http://wiki.opscode.com/display/chef/Resources#Resources-Notifications
Ответы Мрея и Кгилпина идеальны, но недавно я столкнулся с проблемами.
Каким-то образом служба mysql не останавливалась до того, как мне нужно было перезапустить ее, и поэтому мой рецепт не удался. Я использовал обходной путь, используя ресурс '' 'Execute' '' '(мне нужны рецепты, работающие только на Ubuntu). Execute ожидает остановки / запуска, в то время как служба может закончиться раньше (сценарий инициализации завершится, а демон - нет)
execute "Stop service" do command "service stop" end
Я не горжусь этим решением, но оно работает для меня.
Чтобы добавить к этому;
Chef не запускает службу, если /etc/init.d/<DAEMON> status
возвращает значение, отличное от 0. Если возвращается 0, то шеф предполагает, что он запущен.
По умолчанию при запуске и перезапуске службы все это сохраняется до конца запуска chef-client. Если вы действительно хотите запустить или перезапустить две службы, укажите, что они должны произойти немедленно:
service "apache" do
action :start, :immediately
end
Обычно это не лучшая идея, поскольку многократные перезапуски могут вызвать ненужные прерывания обслуживания. Поэтому Chef старается сохранить все перезапуски сервиса до конца запуска.