O Chef 'notifica' falha ao reiniciar ou recarregar serviços

5

Estou usando o chef-solo v10.12.0 para configurar uma VM Ubuntu 12.04, e continuo correndo em um problema em que os serviços não são reiniciados ou recarregados como esperado quando um arquivo de configuração é alterado.

Não há erros no log, embora esteja claramente fazendo todo o resto da receita. Como uma solução alternativa, tenho reiniciado manualmente os serviços ou forçado um recarregamento / reinício sempre que a receita é executada, mas prefiro descobrir o que está errado e fazer com que funcione como esperado.

Um exemplo de receita que falha consistentemente em funcionar como esperado:

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
    
por John Debs 17.07.2012 / 23:10

4 respostas

2

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.

    
por 07.07.2014 / 20:53
0

Este parece ser um problema bastante prevalente com recursos e notificações em geral.

Eu procurei pelo rastreador de ingressos do Opscode JIRA, e há um tíquete que discutiu uma grande quantidade de alterações e correções nas notificações e comportamento dos recursos, a serem liberados em 10.14.0

    
por 20.07.2012 / 15:43
0

Eu tentaria alterar sua definição de serviço para o seguinte

service "pgbouncer" do
    supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
    action :enable
end

Eu acho que lembro de ter experimentado algo semelhante há um tempo atrás e este foi o culpado. Deixe-me saber se isso funciona para você, mas por alguma razão é assim que eu tenho definido meus serviços por um tempo agora e não tive nenhum problema desde então.

    
por 16.06.2015 / 22:39
0

Não tenho certeza se pgbouncer está fornecendo um Upstart ou Init (parece ser Init daqui: link ) mas eu daria uma chance ao seu recurso de serviço se você ainda tiver problemas:

service "pgbouncer" do
  provider Chef::Provider::Service::Init
  supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
  action [:enable, :start]
end

Além disso, adicionaria o argumento :immediately que Gregory Patmore também sugeriu.

    
por 24.08.2015 / 20:07