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

How do you create pretty json in CHEF (ruby)

如何制作人类可读的 erb 模板 json?

以下代码有效,但它生成了一个平面 json 文件

default.rb

default['foo']['bar'] = { :herp => 'true', :derp => 42 }

recipe.rb

template "foo.json" do
  source 'foo.json.erb'
  variables :settings => node['foo']['bar'].to_json
  action :create
end

foo.json.erb

<%= @settings %>

类似的问题
Chef and ruby templates - how to loop though key value pairs?
How can I "pretty" format my JSON output in Ruby on Rails?

正如 this SO Answer 所指出的,.erb 模板非常适合 HTML 和 XML,但不适用于 json。

幸运的是,CHEF 使用其 own json library,它支持使用 .to_json_pretty

IRC 中的@coderanger 指出您可以在食谱中直接使用该库。 This article shows more extensively 如何在食谱中使用厨师助手。

default.rb

# if ['foo']['bar'] is null, to_json_pretty() will error
default['foo']['bar'] = {}

recipe/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

或如 YMMV 所指出的更简洁

default.rb

# if ['foo']['bar'] is null, to_json_pretty() will error
default['foo']['bar'] = {}

recipe/foo.rb

template "foo.json" do
  source 'foo.json.erb'
  variables :settings => node['foo']['bar']
  action :create
end

templates/foo.json.erb

<%= Chef::JSONCompat.to_json_pretty(@settings) %>

类似这样的方法也可以:

file "/var/my-file.json" do
  content Chef::JSONCompat.to_json_pretty(node['foo']['bar'].to_hash)
end

<%= Chef::JSONCompat.to_json_pretty(@settings) %> 很有魅力!!