Я использую chef-solo v10.12.0 для настройки виртуальной машины Ubuntu 12.04, и я продолжаю сталкиваться с проблемой, когда службы не перезапускаются или не перезагружаются должным образом при изменении файла конфигурации.
В журнале ошибок нет, хотя все остальное в рецепте явно делает. В качестве обходного пути я вручную перезапускал службы или принудительно перезагружал / перезапускал каждый раз при выполнении рецепта, но я бы предпочел выяснить, что идет не так, и заставить его работать должным образом.
Один пример рецепта, который постоянно не работает должным образом:
package "pgbouncer"
cookbook_file "/etc/default/pgbouncer" do
source "pgbouncer/pgbouncer"
owner "root"
group "root"
mode 0644
end
service "pgbouncer" do
supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
action [:enable, :start]
end
cookbook_file "/etc/pgbouncer/userlist.txt" do
source "pgbouncer/userlist.txt"
owner "postgres"
group "postgres"
mode 0640
notifies :restart, "service[pgbouncer]"
end
template "/etc/pgbouncer/pgbouncer.ini" do
source "pgbouncer/pgbouncer.ini"
owner "postgres"
group "postgres"
mode 0640
variables :postgres_host => node[:postgres_host]
notifies :restart, "service[pgbouncer]"
end
Первое, что я бы проверил, это то, что у пользователя, запускающего chef-client, есть разрешения на запуск / перезапуск службы (обычно это не проблема).
Затем я бы проверил, нет ли других действующих рецептов, противодействующих логике этого рецепта (иногда проблема, но не часто).
Я действительно думаю, что причиной вашей проблемы является то, как шеф-повар обрабатывает очередь из того, что ему нужно выполнить через оболочку. Множественные и несколько конфликтующие вызовы одной и той же службы могут привести к неожиданному поведению (как вы уже видели). По умолчанию все вызовы «оболочки» обрабатываются как последняя часть фазы конвергенции в прогоне шеф-клиента. Более того, chef не гарантирует какой-либо конкретный порядок выполнения, поэтому часто что-то может происходить не по порядку и может привести к нежелательному поведению в зависимости от программного обеспечения службы, которой вы манипулируете. Обычно все, что вам нужно, - это преодолеть это с помощью описанной ниже техники.
Быстрый и грязный ответ на ваш вопрос - добавить аргумент: timer к вашим вызовам уведомлений. ДОК: http://docs.opscode.com/resource_common.html#notifications-timers
вот предлагаемое обновление вашего примера кода выше:
package "pgbouncer"
service "pgbouncer" do
supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
action [:enable, :start]
end
cookbook_file "/etc/default/pgbouncer" do
source "pgbouncer/pgbouncer"
owner "root"
group "root"
mode 0644
end
cookbook_file "/etc/pgbouncer/userlist.txt" do
source "pgbouncer/userlist.txt"
owner "postgres"
group "postgres"
mode 0640
notifies :restart, "service[pgbouncer]", :immediately
end
template "/etc/pgbouncer/pgbouncer.ini" do
source "pgbouncer/pgbouncer.ini"
owner "postgres"
group "postgres"
mode 0640
variables :postgres_host => node[:postgres_host]
notifies :restart, "service[pgbouncer]", :immediately
end
Это не самый эффективный способ, так как он может привести к тому, что ваш демон будет выполнять слишком много избыточных действий (до 3-х вызовов start like за один запуск: start, restart, restart). Есть еще один, более дружественный к ООП способ сделать это в шеф-поваре, используя определение (DOC: http://docs.opscode.com/essentials_cookbook_definitions.html). По сути, это будет настраиваемая оболочка для ресурса службы pgbouncer, который вы определяете, чтобы уменьшить неэффективность выполнения избыточных вызовов, обеспечивая при этом их эффективное выполнение, но я оставлю вам решать, что лучше для вашего варианта использования.
Не уверен, предоставляет ли pgbouncer Upstart или Init (отсюда похоже, что это Init: http://packages.ubuntu.com/precise/amd64/pgbouncer/filelist), но я бы сделал это с вашим сервисным ресурсом, если у вас все еще есть проблемы:
service "pgbouncer" do
provider Chef::Provider::Service::Init
supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
action [:enable, :start]
end
Кроме того, я бы добавил :immediately
аргумент, который также предложил Грегори Патмор.
Я бы попробовал изменить определение вашей службы на следующее
service "pgbouncer" do
supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
action :enable
end
Я думаю, что недавно испытал нечто подобное, и это было виновником. Сообщите мне, работает ли это для вас, но по какой-то причине я уже некоторое время определяю свои службы именно так, и с тех пор у меня не было никаких проблем.
Это довольно распространенная проблема с ресурсами и уведомлениями в целом.
Я покопался в трекере билетов Opscode JIRA и обнаружил проездной билет в котором обсуждалось большое количество изменений и исправлений в уведомлениях и поведении ресурсов, которые будут выпущены в версии 10.14.0.