我正在尝试为logstash
创建一个特定于网站的包装食谱,其中有一些可混合的属性。
logstash
食谱的工作原理是您拥有default[:logstash][:agent][:inputs]
属性,并且模板使用该属性生成配置文件。
所以,我有一个base
角色,定义了一些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
运行并附加他的输入,最终结果包含所有输入。
这似乎 hackish ,因为我是chef
的新手,我想知道怎么会这样做。我离开角色的原因是它们没有版本化,我读过它们不是保存属性的好地方。
感谢。