2013-05-20 1 views
7

Con Chef, come posso avviare un servizio se non è in esecuzione o riavviare se lo è?Chef: avvia o riavvia il servizio secondo necessità

Sono in esecuzione su Ubuntu 12.04 e il servizio al quale sto attualmente lavorando è PostgreSQL. L'arresto e l'avvio funzionano quasi, ma lo chef sembra provare a avviarlo prima che si fermi completamente e fallisca.

+0

In genere la funzione "restart" degli script di avvio, quando si utilizza "restart" come azione, interrompe prima il servizio e quindi lo avvia. Se non è in esecuzione, lo avvierà. Quindi ti suggerisco di controllare lo script di avvio e utilizzare l'azione "riavvia" nello chef ... –

+1

Il riavvio, purtroppo, causa un errore. Non è felice che il servizio non sia in esecuzione. – Jake

+0

Beh, una cosa che puoi fare è aggiustare lo script di avvio affinché funzioni come preferisci, e usare la risorsa cookbook_file (o template) dello chef per sostituire prima lo script di avvio originale con lo script di avvio e quindi eseguire la risorsa che riavvia Postgresql OPPURE , poiché la risorsa non riesce a riavviarsi, aggiungere un nuovo tentativo (http://docs.opscode.com/chef/resources.html). –

risposta

3

In genere, durante l'installazione di un servizio si utilizza action :start per verificare che funzioni dopo lo chef, vedere Service resource.

Quando si modifica un file che richiede il riavvio del servizio per rendere attive le modifiche, si utilizzano le azioni o :restart (in base a ciò che lo script di init offre). Sembra quindi in questo modo:

template "/etc/postgresql/pg.conf" do 
    source "pg.conf.erb" 
    notifies :restart, "service[postgres]" 
end 

più su Notifications.

+0

Per essere più chiaro ho una ricetta che scrive il post-recovery recovery.conf. Questa ricetta viene eseguita quando viene creato un server slave e anche quando qualcosa cambia con il master, quindi recovery.conf può essere aggiornato per riflettere un nuovo indirizzo IP master, ecc. Nel primo caso il postgres non deve essere mai stato avviato, quindi posso usare il riavvio. – Jake

+0

Forse dovrei avere due ricette molto simili - (aggiorna conf e avvia il servizio) e (aggiorna conf e riavvia il servizio). Non molto SECCO, ma funzionerebbe. – Jake

0

Ecco uno schema del codice che ho utilizzato per eseguire condizionatamente una delle diverse (ri) iniziare azioni di tipo per un contenitore docker. Potrebbe essere adattato per la situazione di (ri) avvio del servizio nel caso in cui il consiglio di riavvio sempre da @ giannis-nohj non funzioni per qualche motivo.

my_file = file ... 

my_image = docker_image 'my-image' do 
    repo 'my-image' 
    action :pull 
end 

ruby_block 'compute docker action' do 
    block do 
    action = if my_image.updated_by_last_action? 
     :redeploy 
    elsif my_file.updated_by_last_action? 
     :restart 
    else 
     :run 
    end 
    resources('docker_container[my-container]').delayed_action(action) 
    end 
end 

docker_container 'my-container' do 
    repo 'my-image' 
    action :nothing 
end