Puppet模板迭代和yaml文件

时间:2017-10-24 18:58:58

标签: ruby yaml puppet erb

我的数据目录中有以下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中,我有绝对的路径......是否有办法使用亲戚?

1 个答案:

答案 0 :(得分:1)

惊人的输入内容将如何回答你自己的问题。我意识到有一个非常简单的解决方案。如果我们拿走我的模板:

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或其他方式加载。