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

Повар останавливает и запускает обслуживание по очереди

У меня в рецепте есть следующие строчки

service "apache" do
  action :stop
end

# Do something..

service "apache" do
  action :start
end

Я обнаружил, что 2-й блок не выполняется. Любая причина?

Уведомления - правильный способ справиться с этим.

Предположим, вы хотите сделать следующее:

  • Условно скачать файл
  • Если файл загружен
    • Немедленно остановите apache
    • Обработать файл (например, разархивировать или переместить)
    • Снова запустите apache

Вы бы сделали это так:

# 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 старается сохранить все перезапуски сервиса до конца запуска.