gpt4 book ai didi

chef-infra - 从 Chef 通知中最小化服务重启?

转载 作者:行者123 更新时间:2023-12-04 17:49:23 26 4
gpt4 key购买 nike

目前,我的具有重要属性的配方结构如下:

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"

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

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

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

此外,我们不能将第二次执行订阅到服务启动,因为如果它已经在运行,我们最终不会执行它。

它非常挑剔,但是否有更好的模式可以遵循以最大程度地减少服务在初始运行时的重新启动?或者在采取特定操作时取消延迟通知的机制?

最佳答案

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]”,如果任何模板资源更改了本次运行的状态。因此排序保持不变,您只能通过服务资源获得一个调用,而不是可能的三个调用。

关于chef-infra - 从 Chef 通知中最小化服务重启?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21066591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com