合并来自不同Chef cookbook或食谱的属性

时间:2014-08-13 08:36:00

标签: ruby chef chef-recipe cookbook berkshelf

是否有可能合并多个食谱或食谱中的属性?

我想要实现的目标如下:

食谱1

设置默认的属性列表 喜欢        default [:bamboo] [:agent] [:attributes] = {            ' system.attr-1' => ' TEST1'        }

template.conf 中的

,我有

<% if @options -%>
<%   @options.sort.map do | option, value | -%>
<%= option %>=  <%= value %>
<%   end -%>
<% end -%>

食谱2

固有&#34;食谱1&#34; 并有2个食谱

RECIPE1

   node.default[:bamboo][:agent][:attributes]                = {
       'system.attr-2'                           => 'test2'
   }

recipe2

   node.default[:bamboo][:agent][:attributes]                = {
       'system.attr-3'                           => 'test3'
   }

现在我想要的是 template.conf &#34; cookbook 1&#34; 更新/合并cookbook2的属性和那些食谱。

这可能吗?如果没有,还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

在食谱2中,你想利用Ruby的Hash#merge

node.default[:bamboo][:agent][:attributes] = node[:bamboo][:agent][:attributes].merge(
  'system.attr-3' => 'test3'
)

然后确保cookbook 2依赖于cookbook 1(因此首先加载属性)。

答案 1 :(得分:0)

不知道这是否是最美丽的方式,但是可以使用

node.default[:bamboo][:agent][:attributes] = node[:bamboo][:agent][:attributes].merge(
    'system.attr-3' => 'test3'
)

template 'bamboo-capabilities.properties' do
path "#{node[:bamboo][:agent][:data_dir]}/bin/bamboocapabilities.properties"
source 'bamboo-capabilities.properties.erb'
cookbook 'bamboo'
  owner  node[:bamboo][:agent][:user]
  group  node[:bamboo][:agent][:group]
  mode 0644
  variables(
      :options => node[:bamboo][:agent][:attributes]
  )
  notifies :restart, 'service[bamboo-agent]', :delayed
end

EDIT :: 好吧,这确实会产生一些问题 因为cookbook1是goint删除旧条目,当它最终到达时 在cookbook2食谱1,它将再次添加条目 这导致每个厨师运行重启