【问题标题】:erb file with chef syntax带有厨师语法的erb文件
【发布时间】:2017-03-08 17:36:58
【问题描述】:

试图输出的内容

node['a'] = {:b "1" :c "2"}

通过这样做:

a: 
<% a = node['a'] %>
 b: <% a[:b] %>
 c: <% a[:c] %>
<% end %>

生成这个:

a: 
 b: 1
 c: 2

但是对于 ruby​​、chef 和 erb 来说,不完全确定执行此操作的正确语法。

【问题讨论】:

  • 您是否要为 conf 文件生成 Yaml?
  • @coderanger 是的。谢谢

标签: ruby chef-infra erb


【解决方案1】:

好的,让我们倒带一下。首先是您通常不想在模板中直接引用节点属性。在某些情况下,比如来自 Ohai 的属性,它可以作为简写,但对于重要数据,我也会通过 variables 属性将其传递,如下所示:

template '/etc/whatever.conf' do
  source 'whatever.conf.erb'
  variables a: node['a']
end

有了这些,我们现在将数据公开为模板变量。第二个改进是让 Ruby 完成生成 YAML 的繁重工作。我们可以使用模板中的.to_yaml 方法来做到这一点:

<%= @a.to_yaml %>

这应该就是你所需要的!

【讨论】:

  • 感谢您的帮助。不幸的是,它必须通过直接在模板中引用节点属性来完成。有没有办法直接在模板中做到这一点?我认为我的语法不太正确。再次感谢您的帮助。
  • 当然,你可以用同样的方法&lt;%= node['a'].to_hash.to_yaml %&gt;,但我们真的不推荐它,因为它会导致非常难以维护的食谱。
  • 谢谢,我不太明白。这是我的 .yml.erb 文件中的一个示例:d: (其中 node['d'] = '5'),我需要在.yml.erb 文件可以让我提取 node['a'] = {:b "1" :c "2"} 的值。我正在为如何访问 :b 和 :c 苦苦挣扎。谢谢
  • 你不要,让to_yaml处理所有这些。
  • 基本上生成 YAML 和 JSON 等文件格式最好留给库,只需在 Ruby 中获取所需的数据结构,然后将其提供给 to_yaml。在这种情况下,您想要的数据可能是node['whatever'].to_hash
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多