Ruby 厨师:你能从一本相关的食谱中将元素添加到属性列表中吗

Ruby 厨师:你能从一本相关的食谱中将元素添加到属性列表中吗,ruby,chef-infra,chef-recipe,Ruby,Chef Infra,Chef Recipe,所以我对厨师和红宝石很不了解。我一直在做一本食谱来安装XDB的telegraf。我为这个配方设计了一个系统,根据默认属性散列中存储的属性列表生成自定义配置 现在我想扩展它,这样依赖的cookbooks就可以添加到生成配置的属性中,这样我就可以向telegraf配置添加新的配置,而不必telegraf配置负责使用它的cookbook引入的部分模板配置。这里是方法 在我的telegraf食谱中,我有这样的默认属性 default['telegraf']['config']['partials'] =

所以我对厨师和红宝石很不了解。我一直在做一本食谱来安装XDB的telegraf。我为这个配方设计了一个系统,根据默认属性散列中存储的属性列表生成自定义配置

现在我想扩展它,这样依赖的cookbooks就可以添加到生成配置的属性中,这样我就可以向telegraf配置添加新的配置,而不必telegraf配置负责使用它的cookbook引入的部分模板配置。这里是方法

在我的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
partials被呈现到telegraf.conf中

<% @partials.each do |partial| %>
<%= render "telegraf/partials/#{partial['templateName']}", :variables => partial['variables']%>
<% end %>
我有点期待它会失败,因为它无法找到新部分模板的.erb。但是从运行日志来看,新项目似乎并没有添加到数组中。我使用了一个数组来维持秩序,但如果不可能的话,可能不得不采取不同的方法

查看完整版本,但不包括tl;dr这很快变得难以管理。使用散列来代替,即使您丢弃了密钥,但您可能会在这里使用密钥作为模板名称。这使得正常的深度合并逻辑可以让您免于很多痛苦

default['telegraf']['config']['partials'].push(
        {
                variables: { environments: ["chi", "main"] },
                templateName: 'test.erb',
        }
)