2013-05-20 162 views
7

隨着廚師,如何啓動服務,如果它沒有運行或重新啓動,如果它是?廚師 - 根據需要啓動或重新啓動服務

我正在運行Ubuntu 12.04,我目前正在處理的服務是PostgreSQL。停止和啓動它幾乎可行,但Chef似乎在它完全停止並失敗之前嘗試啓動它。

+0

通常啓動腳本的「重啓」功能在使用「重啓」作爲動作時,首先會停止服務並啓動它。如果它沒有運行,它只會啓動它。所以我建議你檢查一下你的啓動腳本並使用廚師的「重啓」動作...... –

+1

不幸的是,重新啓動會導致錯誤。服務不運行並不開心。 – Jake

+0

那麼,你可以做的一件事就是修復啓動腳本,只要你喜歡,並使用廚師的cookbook_file(或模板)資源首先用你的啓動腳本替換原始啓動腳本,然後運行重新啓動postgresql的資源或,由於資源無法重新啓動,請添加重試(http://docs.opscode.com/chef/resources.html)。 –

回答

3

通常,您在安裝服務時使用action :start以確保它在大廚運行後運行,請參閱Service resource

當您修改需要重新啓動服務以使更改處於活動狀態的文件時,請使用操作:reload:restart(取決於init腳本提供的內容)。然後,它看起來是這樣的:

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

更多Notifications

+0

爲了更清楚我有一個寫postgres recovery.conf的配方。這個配方是在創建一個從服務器的時候運行的,當主服務器發生任何變化時,這樣recovery.conf可以被更新以反映一個新的主IP地址等等。在第一種情況下,postgres一定不能啓動 - 所以我可以不要使用重新啓動。 – Jake

+0

也許我應該有兩個非常相似的食譜 - (更新conf和啓動服務)和(更新conf和重新啓動服務)。不是很乾,但會起作用。 – Jake

0

下面是我用於有條件地執行Docker容器的幾個(重新)啓動類型操作之一的代碼大綱。在@ giannis-nohj總是重新啓動的建議由於某種原因不起作用的情況下,它可以適用於服務(重新)啓動的情況。

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 
相關問題