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

Chef 'уведомляет' не может перезапустить или перезагрузить службы

Я использую 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.