假设我有一个项目要使用以下模板进行部署: 项目/ file.erb
node['simpe_test_value']
我希望能够编写2个不同的cookbook来部署相同的项目,但模板中使用的属性具有不同的值,例如:
食谱/ TEST1 /食谱/ default.rb
node.default['simple_test_value'] = 'in cookbook test 1'
template "project/test.cfg" do
local true
source "project/test.erb"
end
食谱/ TEST2 /食谱/ default.rb
node.default['simple_test_value'] = 'in cookbook test 2'
template "project/test.cfg" do
local true
source "project/test.erb"
end
Chef将在收敛阶段之前评估所有属性,因此我的模板文件扩展为两个资源的相同值。
我如何实现这一目标?
我的目标是通过仅调整一些属性,为项目使用相同的代码并多次部署(不同的烹饪书/不同的食谱)。
答案 0 :(得分:3)
好的,在评论阅读之后,我确实认为你必须命名你的属性。
如果模板资源相同(目的地中的路径相同),则无法正常工作(或者它将循环更新,您最终只能使用一个文件)。
对于某些部署,我们会执行以下操作:
node['company']['apps']['app1']['simple_value1']="value1"
node['company']['apps']['app1']['simple_value2']="value2"
node['company']['apps']['app2']['simple_value1']="value3"
node['company']['apps']['app2']['simple_value2']="value4"
在配方中,我们使用以下内容渲染模板:
template 'app1/WEB-INF/web.xml' do
source 'web.xml.erb'
cookbook 'app-templates' # specify the source cookbook to avoid duplicating the template file over many cookbooks
variables({
:app_name => 'app1',
:app_vars => node['company']['apps']['app1']
})
end
在模板中,我们使用@app_vars['simple_value1']
和@app_vars['simple_value2']
,有时我们会迭代node['company']['apps'][@app_name]
子属性,以便为每个应用程序使用不同用例的不同用例使用相同的模板。< / p>
例如.erb:
Any line of fixed text
<% node['company']['apps'][@app_name].each do |name, value| -%>
key_<%= name %>=<%= value %>
<% end -%>
Rest of file...
(这里简化但我认为这足以得到这个概念)