Chef pare e inicie o serviço em sequência

5

Eu tenho as seguintes linhas na minha receita

service "apache" do
  action :stop
end

# Do something..

service "apache" do
  action :start
end

Descobri que o segundo bloco não é executado. Qualquer motivo?

    
por Howard 11.04.2012 / 17:07

5 respostas

-1

O padrão para o serviço é iniciado e reiniciado é salvar tudo até o final da execução chef-client. Se você realmente quiser ter dois serviços iniciados ou reiniciados, especifique que eles devem acontecer imediatamente:

service "apache" do 
  action :start, :immediately
end

Geralmente, não é uma boa ideia fazer isso, pois várias reinicializações podem causar interrupções desnecessárias no serviço. É por isso que o Chef tenta salvar todas as reinicializações do serviço até o final da execução.

    
por 11.04.2012 / 22:49
9

As notificações são o jeito certo de lidar com isso.

Suponha que você queira fazer o seguinte:

  • Transferir condicionalmente um arquivo
  • Se o arquivo for baixado
    • Pare o apache imediatamente
    • Processe o arquivo (por exemplo, descompacte-o ou mova-o)
    • Inicie o apache novamente

Você faria assim:

# Define the apache service but don't do anything with it
service "apache" do
  action :nothing
end

# Define your post-fetch script but don't actually do it
execute "process my file" do
   ... your code here
  action :nothing
  notifies :start, "service[apache]"
end

# Fetch the file. Maybe the file won't be fetched because of not_if or checksum.
# In that case apache won't be stopped or started, it will just keep running.
remote_file "/tmp/myfile" do
  source "http://fileserver/myfile"
  notifies :stop, "service[apache]", :immediately
  notifies :run, execute["process my file"]
end
    
por 14.09.2012 / 22:45
7

O problema é que seus recursos possuem o mesmo nome. serviço "apache" não é único, então o chef está desdobrando-os. Suas opções são dar nomes separados como este

service "apache stop" do
  service_name "apache"
  action :stop
end

# Do something

service "apache start" do
  service_name "apache"
  action :start
end

você também pode usar uma notificação do bloco "# Do something" para enviar um: restart para o serviço "apache". Esse é o padrão usual que as pessoas usam, um único serviço, enviando notificações (ou usando assinaturas). Mais aqui:

link

    
por 15.04.2012 / 17:41
1

As respostas de Mray e Kiloilpin são perfeitas, mas tive problemas recentemente.

De alguma forma, o serviço mysql não parou antes de eu precisar reiniciá-lo e, assim, minha receita falhou. Eu usei a solução alternativa usando o recurso '' 'Execute' '' (preciso de receitas trabalhando somente no Ubuntu). Execute está esperando por stop / start, enquanto o serviço pode terminar antes (o script de inicialização terminará, enquanto o daemon não)

execute "Stop service" do
   command "service  stop"
end

Eu não tenho orgulho dessa solução, mas está funcionando para mim.

    
por 07.04.2014 / 18:31
1

Para adicionar isso:

O Chef não inicia um serviço, a menos que /etc/init.d/<DAEMON> status retorne algo diferente de 0. Se ele retornar 0, o chef assumirá que está sendo executado.

    
por 20.05.2014 / 18:12