2015-06-26 63 views
6

你會如何製作具有人類可讀性json的erb模板?如何在CHEF中創建漂亮的json(ruby)

下面的代碼工作,但它是一個平坦的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 %> 

同類SO問題
Chef and ruby templates - how to loop though key value pairs?
How can I "pretty" format my JSON output in Ruby on Rails?

+0

如果您的ERB只是一個'< %= @something%>'你最好使用[文件資源](https://docs.chef.io/resource_file.html)。 – ZombieDev

回答

6

正如指出的this SO Answer .erb模板HTML和XML是偉大的,但不利於JSON。

幸運的是,廚師用其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'] = {} 

配方/ 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 

或者更簡潔,通過因人而異

default.rb指出

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

配方/ foo.rb

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

模板/ foo.json.erb

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

你應該也可以在你的erb模板中做到這一點:<%= Chef :: JSONCompat.to_json_pretty(@settings)%>。我喜歡那樣,因爲它將字符串格式的責任轉化爲模板中的視圖邏輯。因人而異。 – lamont

4

像這樣的事情也將工作:

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

youre missing''' – austinheiman

+0

@ web-student-ksu謝謝! – sandstrom