我试图在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'
}
如何干净地覆盖此属性以仅设置到我的包装器手册中的内容?
答案 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
如果您正在寻找快速/临时黑客,请将其放在那里。希望它有所帮助!