覆盖默认哈希而不合并

时间:2014-04-07 03:12:02

标签: chef logstash chef-solo

我试图在lusis/chef-logstash使用chef-logstash食谱,并且很难重写['logstash']['instance']['server']['config_templates']属性。当我通过wrapper-logstash的包装器食谱设置它时,我得到了默认的合并散列以及我通过我的包装器配方添加的内容。

作为参考,我在食谱中使用的代码是:

#force override our attributes (or attempt to anyways)
#attributes = node['logstash']['instance'][name]
node.force_override['logstash']['instance']['server']['config_templates'] = {}
node.force_override['logstash']['instance']['server']['config_templates'] = {
   'input_redis' => 'config/input_redis.conf.erb',
   'filter_sidewinder' => 'config/filter_sidewinder.conf.erb',
   'output_elasticsearch' => 'config/output_elasticsearch.conf.erb'
}

如何干净地覆盖此属性以仅设置到我的包装器手册中的内容?

2 个答案:

答案 0 :(得分:3)

在@LearnChef工作人员的大量帮助下,解决方案是在我的包装器配方中使用ruby代码迭代密钥并删除它们。 gotchya确保迭代和删除循环使用与原始默认属性相同的属性优先级,它们在源LWRP中设置,而不是在默认级别,而是在正常级别。

最终代码如下:

#clear out the default config templates
attributes = node['logstash']['instance'][name]
node.normal['logstash']['instance'][name]['config_templates'].keys.each do |k|
  node.normal['logstash']['instance'][name]['config_templates'].delete(k)
end
node.force_override['logstash']['instance']['server']['config_templates'] = {
  'input_redis' => 'config/input_redis.conf.erb',
  'filter_sidewinder' => 'config/filter_sidewinder.conf.erb',
  'output_elasticsearch' => 'config/output_elasticsearch.conf.erb'
}

答案 1 :(得分:0)

在类似的用例中,我只是想将哈希设置为空哈希。快速和快速对我有用的脏解决方法是将属性设置为空数组,如下所示:

原始属性定义:

#give us an elasticsearch cluster with these plugins by default
default['elasticsearch']['plugins'] = {
  'karmi/elasticsearch-paramedic' => {},
  'mobz/elasticsearch-head' => {},
  'jlinn/elasticsearch-cloud-rackspace' => {
    'url' => 'https://github.com/jlinn/elasticsearch-cloud-rackspace/releases/download/v0.4.1/elasticsearch-cloud-rackspace-0.4.1.zip'
  }
}

我在环境中的定义:

"elasticsearch": {
  "plugins": []
}

这是使用它的代码:

node[:elasticsearch][:plugins].each do | name, config |
  next if name == 'elasticsearch/elasticsearch-cloud-aws' && !node.recipe?('aws')
  next if name == 'elasticsearch/elasticsearch-cloud-gce' && !node.recipe?('gce')
  install_plugin name, config
end

如果您正在寻找快速/临时黑客,请将其放在那里。希望它有所帮助!