如何在CHEF中创建漂亮的json(ruby)

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库,该库支持使用.to_json_pretty进行此操作。

@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