最大限度地减少厨师通知的服务重启?

目前,我的配方与重要的属性是这样构造的:

service 'myservice' do
  action :nothing
  supports :status => true, :start => true, :stop => true, :restart => true
end

package 'packagename' do
  ...
end

template 'configfile1'
  notifies :restart, 'service[myservice]'
end
...
template 'configfileN'
  notifies :restart, 'service[myservice]'
end

execute "a command from package which generates and enables the init script" do
  notifies :start, 'service[myservice]', :immediately
end

execute "a command that should run once every time, that requires service to be running"

通过这样做,我们确保服务的初始启动具有配置文件,在每次运行期间服务正在为第二个执行块运行,并且如果有任何配置文件发生更改,我们将重新启动服务以获取更改。

但是,如果厨师运行发生在服务的初始状态停止的地方(例如第一次运行或者发生了不良事件),并且配置文件已经发生变化(特别是在第一次运行时,但对其他运行可能)时,第一个执行块将导致服务以正确的配置文件启动,然后在运行结束时服务将不必要地重新启动。 (当然,假设初始启动后的资源不会导致服务重启)

更改通知的目标操作似乎不起作用(因为即时通知仍将立即发生,然后延迟通知仍会发生),并且此外不会正确。

另外我们也不能订阅第二个执行到服务启动,因为如果它已经运行,我们会结束不执行它。

这是非常挑剔的,但有没有更好的模式可以遵循,以尽量减少重新启动服务的初始运行? 或者在采取特定行动时取消延迟通知的机制?


我用一个标志文件来实现这一点。

像下面的“apt-get update”不会执行一次。

cookbook_file '/etc/apt/sources.list.d/maven.list' do
  source "repo_files/ubuntu_maven.list"
  cookbook "fluig-files"
  mode 0644
  notifies :run, "execute[should_update_repo]", :immediately
end

cookbook_file '/etc/apt/sources.list.d/couchbase.list' do
  source "repo_files/ubuntu_couchbase.list"
  cookbook "fluig-files"
  mode 0644
  notifies :run, "execute[should_update_repo]", :immediately
end

execute "apt-key couchbase" do
  command "apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A3FAA648D9223EDA"
  action :run
  not_if "apt-key list | grep couchbase"
  notifies :run, "execute[should_update_repo]", :immediately
end

execute "should_update_repo" do
  command "touch /tmp/should_update_repo"
  action :nothing
end

# Update system
execute "apt-get update" do
  command "rm -rf /tmp/should_update_repo && apt-get update"
  action :run
  only_if "test -f /tmp/should_update_repo"
end

Chef旨在表达配置策略(系统状态),这与表示一系列要执行的任务稍有不同。

幸运的是,由于DSL是基于ruby的,因此可以在运行时重新定义资源。

template "configfile1" do
  notifies :create, "ruby_block[restart_service1]", :immediately
end

template "configfile2" do
  notifies :create, "ruby_block[restart_service1]", :immediately
end

service "service1" do
  action [:enable, :start]
end

ruby_block "restart_service1" do
  block do

    r = resources(:service => "service1")
    a = Array.new(r.action)

    a << :restart unless a.include?(:restart)
    a.delete(:start) if a.include?(:restart)

    r.action(a)

  end
  action :nothing
end

如果有任何模板资源在本次运行中改变了状态,这将重写服务资源以具有“action [:enable,:restart]”而不是“action [:enable,:start]”。 所以订单保持不变,您只能通过服务资源获得一次呼叫,而不是三次。


我不确定,如果能够多次重新启动服务来解决您的问题,但是这种结构似乎更符合我的逻辑。

#Prepare everything to start the service
package 'packagename' do
  ...
end

template 'configfile1'
  notifies :restart, 'service[myservice]'
end
...
template 'configfileN'
  notifies :restart, 'service[myservice]'
end

execute "a command from package which generates and enables the init script" do
  notifies :restart, 'service[myservice]'
end

#Start the service
service 'myservice' do
  action :start
  supports :status => true, :start => true, :stop => true, :restart => true
end

#At this point service is surely running
execute "a command that should run once every time, that requires service to be running"

每个更改配置文件的资源都应通知服务重新启动。

我想厨师很聪明,不要重新启动刚开始的服务。 (我之前没有注意到这一点,但在我看来,如果有不必要的重新启动,我会有这种情况)

链接地址: http://www.djcxy.com/p/78305.html

上一篇: Minimize service restarts from chef notifications?

下一篇: chef deploy start service and restart service in sequence