Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you create pretty json in CHEF (ruby)

How would you make an erb template that has human readable json?

The following code works, but it makes a flat json file

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 %>

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

like image 389
spuder Avatar asked Jun 26 '15 23:06

spuder


People also ask

How do I show pretty JSON?

Use JSON. stringify(obj) method to convert JavaScript objects into strings and display it. Use JSON. stringify(obj, replacer, space) method to convert JavaScript objects into strings in pretty format.

What are templates in chef?

A cookbook template is an Embedded Ruby (ERB) template that is used to dynamically generate static text files. Templates may contain Ruby expressions and statements, and are a great way to manage configuration files.


1 Answers

As pointed out by this SO Answer .erb templates are great for HTML, and XML, but is not good for json.

Luckily, CHEF uses its own json library which has support for this using .to_json_pretty

@coderanger in IRC, pointed out that you can use this library right inside the recipe. This article shows more extensively how to use chef helpers in recipes.

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

Or more concise as pointed out by 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) %>
like image 143
spuder Avatar answered Sep 28 '22 10:09

spuder