spu*_*der 6 ruby erb chef-infra
你会如何制作一个具有人类可读json的erb模板?
以下代码有效,但它生成一个扁平的json文件
default.rb
default['foo']['bar'] = { :herp => 'true', :derp => 42 }
Run Code Online (Sandbox Code Playgroud)
recipe.rb
template "foo.json" do
source 'foo.json.erb'
variables :settings => node['foo']['bar'].to_json
action :create
end
Run Code Online (Sandbox Code Playgroud)
foo.json.erb
<%= @settings %>
Run Code Online (Sandbox Code Playgroud)
类似的SO问题
Chef和ruby模板 - 如何循环键值对?
如何在Ruby on Rails中"漂亮"格式化我的JSON输出?
正如本SO答案所指出的.erb模板非常适合HTML和XML,但对json并不好.
幸运的是,CHEF使用自己的json库来支持这种使用.to_json_pretty
IRC中的@coderanger指出,您可以在配方中使用此库.本文更广泛地展示了如何在食谱中使用厨师助手.
default.rb
# if ['foo']['bar'] is null, to_json_pretty() will error
default['foo']['bar'] = {}
Run Code Online (Sandbox Code Playgroud)
食谱/ foo.rb
pretty_settings = Chef::JSONCompat.to_json_pretty(node['foo']['bar'])
template "foo.json" do
source 'foo.json.erb'
variables :settings => pretty_settings
action :create
end
Run Code Online (Sandbox Code Playgroud)
或者更简洁,正如YMMV所指出的那样
default.rb
# if ['foo']['bar'] is null, to_json_pretty() will error
default['foo']['bar'] = {}
Run Code Online (Sandbox Code Playgroud)
食谱/ foo.rb
template "foo.json" do
source 'foo.json.erb'
variables :settings => node['foo']['bar']
action :create
end
Run Code Online (Sandbox Code Playgroud)
模板/ foo.json.erb
<%= Chef::JSONCompat.to_json_pretty(@settings) %>
Run Code Online (Sandbox Code Playgroud)
像这样的东西也可以工作:
file "/var/my-file.json" do
content Chef::JSONCompat.to_json_pretty(node['foo']['bar'].to_hash)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6360 次 |
| 最近记录: |