我正在尝试在lusis/chef-logstash上使用chef-logstash cookbook,并且很难覆盖['logstash']['instance']['server']['config_templates']
属性。当我通过包装器食谱在包装器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'
}
如何干净地覆盖此属性以仅设置为包装器说明书中的内容?
在@LearnChef工作人员的帮助下,解决方案是在我的包装器配方中使用 ruby 代码来迭代密钥并删除它们。一个陷阱是确保迭代和删除循环使用与原始默认属性相同的属性优先级级别,这些属性在源 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'
}
在类似的用例中,我只想将我的哈希设置为空哈希。一个对我有用的快速而肮脏的解决方法是将属性设置为空数组,如下所示:
原始属性定义:
#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
只是把它放在那里,以防你也在寻找一个快速/临时的黑客。希望对您有所帮助!