0

我正在尝试为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_listrecipe[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我想知道如何去做。我离开角色的原因是它们没有版本控制,而且我读过它们不是保留属性的好地方。

谢谢。

4

0 回答 0