我的Chef配方中有很多地方需要按顺序运行操作,并且需要在多个地方引用该序列。例如,一系列操作是“停止Tomcat,重新编译应用程序,启动Tomcat”,这可以由“应用程序源树更改”等事件触发。
我需要能够使用来自各种资源的notifies
属性(包括:delayed
功能)以及序列本身的subscribes
属性触发这些操作序列,因为序列可以由其他配方中的资源触发,如果它们存在,它将重新启动Tomcat,但实际上并不依赖于Tomcat配方。
管理这些操作组的最佳方法是什么?
我从the Chef docs看到,处理此问题的方法是让任何相关事件按顺序通知所有这些操作:
git 'repo' do
notifies :stop, 'service[tomcat]', :delayed
notifies :run, 'recompile_app', :delayed
notifies :start, 'service[tomcat]', :delayed
end
但是,这一系列事件可能会触发相当多的资源,并且这种级别的代码重复似乎效率低下且容易出错。
有没有更好的方法来解决这个问题?
答案 0 :(得分:0)
听起来你想要LWRP或definition。 LWRP将围绕资源集合创建一个包装器,因此它只会在资源集合中出现一次。这就像是Chef的延伸。定义将包装一系列资源,但每个资源仍然存在于资源集合中。
在您的示例中,我将使用定义:
define :my_thing do
git 'repo' do
# ...
end
service 'tomcat' do
action :stop
end
execute 'recompile_app' do
action :run
end
service 'tomcat' do
action :start
end
end
来源: