Puppet 模板迭代和 yaml 文件

Puppet Templates Iterations and yaml files

我的数据目录中有以下 yaml 文件:

---
type:
  - config_setting1:
    foo: bar
  - config_setting2:
    foo: bar

我的 .erb 模板如下所示:

conf {
<% settings = YAML.load_file('/etc/puppetlabs/code/environments/example/data/conf.yaml') -%>
<% settings['type'].each do |val| -%>
  <%= val %>
<% end -%>
}

当我在我的代理机器上 运行 puppet 时,我得到了这个:

conf {
  {"config_setting1"=>nil, "foo"=>"bar"}
  {"config_setting2"=>nil, "foo"=>"bar"}
}

我的最终目标是让输出看起来像这样:

conf {
  config_setting1 {
    foo: bar
  }
  config_setting2 {
    foo: bar
  }
}

我知道我需要对我的模板做一些清理工作才能真正让事情以这种方式输出,但我现在更关注如何而不是最终结果。如您所见,我熟悉使用设置末尾的 ['type'] 来浏览嵌套哈希,并且我意识到如果我对它进行硬编码,我可以很容易地创建这个结构,但我想了解如何迭代地使用它。我一直在尝试在迭代中遵循 Puppet Documentation,但即使您逐字复制它们,它们的示例也不起作用……这让事情变得有点困难。我怎样才能像我一样在嵌套的 yaml 文件中调用拉出单个数据?只是键还是只是一个特定的值?我试过类似的东西:

<% settings['type'].each do |val| -%>
  <%= settings['val'] %>
<% end -%>

和它的多种变体,但我找不到正确的语法来获得我想要的。我也尝试过使用 <% settings['type'].each do |index, value| -%> 的方法,但我也无法从中得到任何我可以使用的结果。如果有人能指出我正确的方向,我将不胜感激。我很乐意被告知我也会以完全错误的方式进行此操作;如果有更好的方法来获取这些数据,我会洗耳恭听。

另一个不太重要但仍然让我烦恼的问题 - 在我的 load_file 中我有绝对路径...有没有办法使用相对路径?

令人惊奇的是,输入内容会回答您自己的问题。我意识到有一个非常简单的解决方案。如果我们采用我的模板:

conf {
<% settings = YAML.load_file('/etc/puppetlabs/code/environments/example/data/conf.yaml') -%>
<% settings['type'].each do |val| -%>
  <%= val %>
<% end -%>
}

并在第三行将 <% settings['type'].each do |val| -%> 替换为 <% settings.keys.each do |val| -%> 我能够得到我要找的东西。如果有更好的方法来做到这一点,我仍然很感兴趣,无论是我如何通过 yaml 加载还是以其他方式加载。