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

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输出?

spu*_*der 7

正如本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)

  • 您还应该能够在erb模板中执行此操作:<%= Chef :: JSONCompat.to_json_pretty(@settings)%>.我有点喜欢它,因为它将字符串格式的责任转化为模板中的视图逻辑.因人而异. (2认同)

san*_*rom 6

像这样的东西也可以工作:

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