You'll need to run this on the Server in Orgmapper, eg:
/opt/opscode/bin/orgmapper
orgmapper>> eval(::File.read("/path/to/code.rb"))
This is the code file you'll want to save
node_map = Hash.new { |h, k| h[k] = [] }
node_map[:orgs] = {}
sql.select(:name, :org_id, :serialized_object).from(:nodes).each do |node|
begin
so = Zlib::GzipReader.new(StringIO.new(node[:serialized_object])).read
node[:serialized_object] =
JSON.parse(so, create_addtions: false, symbolize_names: true)
rescue
# If the JSON doesn't parse just move on
end
node_map[:orgs][node[:org_id]] ||= {}
node_map[:orgs][node[:org_id]][:nodes] ||= []
node_map[:orgs][node[:org_id]][:nodes] << node
end
node_map[:orgs].dup.each do |org_id, _|
org_name = ORGS.all.find { |org| org['guid'] == org_id }['name']
node_map[:orgs][org_name] = node_map[:orgs].delete(org_id)
end
File.open('/tmp/nodes.json', 'w') { |f| f.write JSON.pretty_generate(node_map) }
Chef 12 moved everything to pgsql, so you can just query postgres
/opt/opscode/embedded/bin/psql -U opscode_chef -h 127.0.0.1
SELECT
n.name AS node,
o.name AS org
FROM nodes n
INNER JOIN orgs o ON n.org_id = o.id
GROUP BY
n.name,
o.name;
Or you can still use Ruby
su opscode-pgsql -c "/opt/opscode/embedded/bin/pry -r json -r zlib -r stringio -r sequel -r chef"
node_map = Hash.new { |h, k| h[k] = [] }
node_map[:orgs] = {}
secrets = JSON.parse(File.read('/etc/opscode/private-chef-secrets.json'))
sql = Sequel.connect(['postgres://opscode_chef:',
"#{secrets['postgresql']['sql_password']}",
'@127.0.0.1:5432/opscode_chef'].join)
sql.from(:orgs).join(:nodes, org_id: :id).each do |node|
begin
so = Zlib::GzipReader.new(StringIO.new(node[:serialized_object])).read
node[:serialized_object] =
JSON.parse(so, create_addtions: false, symbolize_names: true)
rescue
# If the JSON doesn't parse just move on
end
node_map[:orgs][node[:full_name]] ||= {}
node_map[:orgs][node[:full_name]][:nodes] ||= []
node_map[:orgs][node[:full_name]][:nodes] << node
end
File.open('/tmp/nodes.json', 'w') { |f| f.write JSON.pretty_generate(node_map) }