Chef:为不同的cookbook定义具有不同值的相同属性

时间:2015-02-26 11:16:36

标签: ruby chef

假设我有一个项目要使用以下模板进行部署: 项目/ 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将在收敛阶段之前评估所有属性,因此我的模板文件扩展为两个资源的相同值。

我如何实现这一目标?

我的目标是通过仅调整一些属性,为项目使用相同的代码并多次部署(不同的烹饪书/不同的食谱)。

1 个答案:

答案 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...

(这里简化但我认为这足以得到这个概念)