Посмотрите на, выройте:
# dig bestbuy.com
; <<>> DiG 9.5.0-P2.1 <<>> bestbuy.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 395
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;bestbuy.com. IN A
;; ANSWER SECTION:
bestbuy.com. 20 IN A 173.223.232.48
bestbuy.com. 20 IN A 173.223.232.98
;; Query time: 52 msec
;; SERVER: 72.249.191.254#53(72.249.191.254)
;; WHEN: Sat Aug 14 14:26:35 2010
;; MSG SIZE rcvd: 61
Как указано выше, они делают это для выравнивания нагрузки, заменяют и т.д... Но это - довольно небезопасный способ сделать его, потому что выравнивание нагрузки DNS работает близко к циклическому алгоритму: каждый раз Вы просите имя хоста, ответы сервера DNS с одним из пула (как Вы посмотрите случай в своем ping). К сожалению, это означает, что в случае одного из "серверов" понижается, половина запросов перестанет работать.
Лучше реализовать то использование истинной подсистемы балансировки нагрузки или VIP (виртуальный IP).
Первое, что я бы проверил, что пользователь, запущенный chef-клиентом, имеет разрешения на запуск/перезапуск службы (обычно это не проблема).
Далее я бы проверил, что нет других запущенных рецептов, которые противоречат логике этого рецепта (иногда проблема, но не часто).
То, что я действительно думаю, что вызывает вашу проблему, это то, как шеф-повар обрабатывает очередь того, что ему нужно выполнить через оболочку. Многочисленные и несколько противоречивые обращения к одному и тому же сервису могут привести к неожиданному поведению (как вы уже видели). По умолчанию, все вызовы 'оболочки' обрабатываются как последняя часть фазы конвергенции в запуске chef-клиента. Более того, шеф-повар не гарантирует никакого определенного порядка выполнения, так что вещи могут часто происходить не в порядке и могут приводить к нежелательному поведению в зависимости от программного обеспечения сервиса, которым вы манипулируете. Обычно все, что вам нужно, - это избавиться от техники, описанной ниже
Быстрый и грязный ответ на ваш вопрос - добавить аргумент :таймер к вашим вызовам оповещения. DOC: 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, который вы определяете, чтобы уменьшить неэффективность выполнения избыточных вызовов, при этом гарантируя их эффективное выполнение, но я оставлю решение за вами.
.Я бы попытался изменить определение вашей службы на следующее
service "pgbouncer" do
supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
action :enable
end
Я помню, как недавно испытал нечто подобное, и это было виновником. Сообщите мне, работает ли это для вас, но по какой-то причине я уже некоторое время определяю свои службы именно так, и с тех пор у меня не было никаких проблем.
Не уверен, предоставляет ли 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
Кроме того, я бы добавил : немедленно
аргумент, который также предложил Грегори Патмор.