2013-05-20 123 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 
相关问题