厨师:您可以从相关食谱中将元素添加到属性列表中吗?

时间:2018-07-27 21:25:56

标签: ruby chef chef-recipe

所以我对厨师和红宝石非常满意。我正在制作安装influxdb的telegraf的食谱。我已经为此配方设计了一个系统,该系统可以基于存储在默认属性哈希中的属性列表来生成自定义配置。

现在,我想对此进行扩展,以便依赖的菜谱可以添加到生成配置的属性中,这样我就可以将新配置添加到telegraf配置中,而不必由telegraf配置负责由配置文件引入的部分模板配置。使用它的食谱。这是方法。

在我的telegraf食谱中,我具有这样的默认属性

default['telegraf']['config']['partials'] = [
    {
            variables: { hostname: "hostname" },
            templateName: 'output-win-perf-influxdb.erb',
    },
    {
            variables: {},
            templateName: 'input-win-perf-statsd.erb',
    },
    {
            variables: {},
            templateName: 'input-win-perf-system.erb',
    }
]

以及在此模板资源中使用的

template 'C:\\Program Files\\telegraf\\telegraf.conf' do
  source 'telegraf/telegraf.conf.erb'
  action :create
  variables (node.default['telegraf']['config'])
end

使用

将部分内容渲染到telegraf.conf中。
<% @partials.each do |partial| %>
<%= render "telegraf/partials/#{partial['templateName']}", :variables => partial['variables']%>
<% end %>

现在要测试如何扩展到相关的食谱,我创建了一个新的食谱,该食谱依赖于win-telegraf。在新的食谱中,我试图像这样

添加到partials的列表中
default['telegraf']['config']['partials'].push(
        {
                variables: { environments: ["chi", "main"] },
                templateName: 'test.erb',
        }
)

我有点希望这会失败,因为它无法找到新的部分模板的.erb。但是查看运行日志,甚至没有显示新项目已添加到阵列中。我使用数组来维护顺序,但是如果不可能的话,可能不得不采用其他方法。

1 个答案:

答案 0 :(得分:1)

签出https://coderanger.net/arrays-and-chef/以获得完整版本,但是tl; dr很快变得难以管理。即使您丢弃了密钥,也可以使用哈希(尽管您可以在此处将密钥用作模板名称)。这使常规的深度合并逻辑可以使您免于痛苦。