Chef:为不同的食谱定义具有不同值的相同属性
Chef: Define same attribute with different values for different cookbooks
假设我有一个项目要使用如下模板部署:
project/file.erb
node['simpe_test_value']
我希望能够编写 2 个不同的说明书来部署同一个项目,但模板中使用的属性具有不同的值,例如:
cookbooks/test1/recipes/default.rb
node.default['simple_test_value'] = 'in cookbook test 1'
template "project/test.cfg" do
local true
source "project/test.erb"
end
cookbooks/test2/recipes/default.rb
node.default['simple_test_value'] = 'in cookbook test 2'
template "project/test.cfg" do
local true
source "project/test.erb"
end
Chef 将在收敛阶段之前评估所有属性,因此我的模板文件扩展为两个资源的相同值。
我该如何实现?
我的目标是为一个项目使用相同的代码并通过仅调整一些属性来多次部署它(不同的 cookbooks/different 配方)。
好的,在阅读评论后我真的认为你必须命名你的属性。
如果模板资源相同(目标路径相同),则无法正常工作(否则它将循环更新,最终您将只有一个文件)。
对于某些部署,我们会执行以下操作:
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]
子属性,以便针对每个应用具有不同数量值的不同用例使用相同的模板.
例如.erb:
Any line of fixed text
<% node['company']['apps'][@app_name].each do |name, value| -%>
key_<%= name %>=<%= value %>
<% end -%>
Rest of file...
(此处简化但我认为足以理解概念)
假设我有一个项目要使用如下模板部署: project/file.erb
node['simpe_test_value']
我希望能够编写 2 个不同的说明书来部署同一个项目,但模板中使用的属性具有不同的值,例如:
cookbooks/test1/recipes/default.rb
node.default['simple_test_value'] = 'in cookbook test 1'
template "project/test.cfg" do
local true
source "project/test.erb"
end
cookbooks/test2/recipes/default.rb
node.default['simple_test_value'] = 'in cookbook test 2'
template "project/test.cfg" do
local true
source "project/test.erb"
end
Chef 将在收敛阶段之前评估所有属性,因此我的模板文件扩展为两个资源的相同值。
我该如何实现?
我的目标是为一个项目使用相同的代码并通过仅调整一些属性来多次部署它(不同的 cookbooks/different 配方)。
好的,在阅读评论后我真的认为你必须命名你的属性。
如果模板资源相同(目标路径相同),则无法正常工作(否则它将循环更新,最终您将只有一个文件)。
对于某些部署,我们会执行以下操作:
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]
子属性,以便针对每个应用具有不同数量值的不同用例使用相同的模板.
例如.erb:
Any line of fixed text
<% node['company']['apps'][@app_name].each do |name, value| -%>
key_<%= name %>=<%= value %>
<% end -%>
Rest of file...
(此处简化但我认为足以理解概念)