A primeira coisa que gostaria de verificar é que o usuário que está executando o chef-client tem permissões para iniciar / reiniciar o serviço (geralmente não o problema).
Em seguida, eu verifico que não há outras receitas em execução que estejam neutralizando a lógica dessa receita (às vezes, o problema, mas não com frequência).
O que eu realmente acho que está causando o problema é a forma como o chef lida com a fila do que ele precisa para executar por meio do shell. Chamadas múltiplas e um pouco conflitantes para o mesmo serviço podem levar a um comportamento inesperado (como você já viu). Por padrão, todas as chamadas 'shell' são tratadas como a última parte da fase de convergência em uma execução chef-client. Além disso, o chef não garante nenhuma ordem específica de execução, portanto, as coisas podem acontecer com freqüência fora da ordem e podem produzir um comportamento indesejado, dependendo do software do serviço que você está manipulando. Normalmente, contrariando isso com a técnica abaixo é tudo que você precisa.
A resposta rápida e suja à sua pergunta é adicionar um argumento: timer às suas chamadas de notificação. DOC: link
aqui está uma sugestão de atualização para o seu código de exemplo acima:
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
Esta não é a maneira mais eficiente de fazer isso, pois pode fazer com que o seu daemon execute muitas ações redundantes (até 3 chamadas 'iniciar como' em uma execução: iniciar, reiniciar, reiniciar). Há outra maneira mais amigável de fazer isso no chef, aproveitando uma definição (DOC: link ). Isso seria essencialmente um wrapper personalizado para o recurso de serviço pgbouncer que você define para reduzir as ineficiências da execução de chamadas redundantes, garantindo que elas sejam executadas com eficiência, mas deixaremos que você decida o que é melhor para seu caso de uso.