How do you create pretty json in CHEF (ruby)
如何制作一个具有人类可读JSON的erb模板?
下面的代码可以工作,但它可以生成一个简单的JSON文件
默认.rb
1 | default['foo']['bar'] = { :herp => 'true', :derp => 42 } |
配方.rb
1 2 3 4 5 | template"foo.json" do source 'foo.json.erb' variables :settings => node['foo']['bar'].to_json action :create end |
号
foo.json.erb公司
1 | <%= @settings %> |
类似的问题Chef和Ruby模板-如何循环键值对?如何在RubyonRails中"漂亮地"格式化JSON输出?
正如这个答案所指出的那样,erb模板对于HTML和XML很好,但是对于JSON不好。
幸运的是,Chef使用了自己的JSON库,该库支持使用
@IRC中的coderanger,指出您可以在配方中使用这个库。本文更广泛地展示了如何在食谱中使用厨师助手。
默认.rb
1 2 | # if ['foo']['bar'] is null, to_json_pretty() will error default['foo']['bar'] = {} |
配方/foo.rb
1 2 3 4 5 6 7 | 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 |
号
或者更简洁,如YMMV所指出的。
默认.rb
1 2 | # if ['foo']['bar'] is null, to_json_pretty() will error default['foo']['bar'] = {} |
配方/foo.rb
1 2 3 4 5 | template"foo.json" do source 'foo.json.erb' variables :settings => node['foo']['bar'] action :create end |
。
模板/foo.json.erb
1 | <%= Chef::JSONCompat.to_json_pretty(@settings) %> |
类似的事情也会奏效:
1 2 3 | file"/var/my-file.json" do content Chef::JSONCompat.to_json_pretty(node['foo']['bar'].to_hash) end |
。