我正在尝试为logstash
具有某种可混合属性的特定于站点的包装食谱创建。
食谱的工作原理logstash
是你有一个default[:logstash][:agent][:inputs]
属性,模板使用它生成一个配置文件。
所以,我有一个base
角色,它定义了 some inputs
,一个python_service
角色定义了其他输入,以及一个node
同时具有这两个角色的角色,所有这些inputs
都会合并,并且会生成一个包含所有输入的配置。
我正在尝试使用recipes
.
我创建了一work-logstash
本食谱,它有work-logstash::base
食谱和work-logstash::python_service
食谱。食谱基本上看起来像这样,只有不同的设置(和其他细节):
include_recipe 'work-logstash::default'
node.default[:logstash][:agent][:inputs] = [
{
:udp => {
:type => "syslog",
:port => 5544
}
}
]
问题何时run_list
是recipe[work-logstash::base], recipe[work-logstash::python_service]最后一个配方只是覆盖inputs
集合而不是合并。
我找到的解决方案如下:
inputs = [
{
:udp => {
:type => "syslog",
:port => 5544
}
}
]
inputs.each do |i|
node.default[:logstash][:agent][:inputs] << i
end
只需append
输入到默认属性,因此每个recipe
运行并附加他的输入,最终结果具有所有输入。
这似乎很骇人听闻,因为我是新手,chef
我想知道如何去做。我离开角色的原因是它们没有版本控制,而且我读过它们不是保留属性的好地方。
谢谢。