在包装器菜谱中合并配方之间的属性

时间:2014-04-13 19:29:24

标签: chef chef-recipe berkshelf

我正在尝试为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的新手,我想知道怎么会这样做。我离开角色的原因是它们没有版本化,我读过它们不是保存属性的好地方。

感谢。

0 个答案:

没有答案