2014-01-14 30 views
1

我的厨师食谱中有很多地方需要按顺序运行操作,并且需要在多个地方引用该顺序。例如,一个操作序列是“停止Tomcat,重新编译应用程序,启动Tomcat”,这可以通过“应用程序源树变化”等事件触发。Chef的链接/分组资源

我需要能够的操作都需要从各种资源(包括:delayed功能)都notifies属性,再加上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

如果你有很多地方某种代码重复,你应该将它解压缩到库中(http://docs.opscode.com/essentials_c ookbook_libraries.html)或LWRP(http://docs.opscode.com/lwrp_custom.html)。 –

回答

0

听起来像是你想要一个LWRPdefinition。 LWRP将为资源集合创建一个包装,所以它只会在资源集合中出现一次。这就像厨师的延伸。定义将包装一系列资源,但每个资源仍然存在于资源集合中。

在你的榜样,我会用一个定义:

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 

来源:

+0

什么是替代这些定义的“订阅”使用的适当方式?简单地添加一个'subscribes'子句并不适合我。如果包含它的食谱,我有一些资源需要调用该定义,否则不需要。 – spiffytech

+0

登录被翻转。 – sethvargo

+0

你的意思是哪个登录名?另外,我如何以延迟的方式调用这个定义,就像我的文章中的资源一样? – spiffytech