Skip to content

Instantly share code, notes, and snippets.

@botchagalupe
Created January 20, 2011 20:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save botchagalupe/788627 to your computer and use it in GitHub Desktop.
Save botchagalupe/788627 to your computer and use it in GitHub Desktop.
Knife Report1

This is an example report running from knife exec

This example uses google spreadsheets to store the results.

You will first need to install the google spreadsheet GEM

$ gem sources -a http://gemcutter.org
$ sudo gem install google-spreadsheet-ruby

More information about this GEM can be found at https://github.com/gimite/google-spreadsheet-ruby

Invoking the report

Use:

 knife exec <report_name> <query>

For example:

 knife exec report1 role:base

Sample code

require 'google_spreadsheet'

def time_difference_in_hms(unix_time)
  now = Time.now.to_i
  difference = now - unix_time.to_i
  hours = (difference / 3600).to_i
  difference = difference % 3600
  minutes = (difference / 60).to_i
  seconds = (difference % 60)
  return [hours, minutes, seconds]
end

def put_headers object,list
  cnt = 1
  list.each do |title|
   object[1,cnt] = title
   cnt +=1
  end
end

abort("usage: knife exec report1  QUERY") unless ARGV[2]

q = Chef::Search::Query.new
nodes = q.search(:node, ARGV[2])[0]

session = GoogleSpreadsheet.login ENV["GOOGLE_EMAIL"], ENV["GOOGLE_PASSWORD"]
sheet = session.create_spreadsheet "Instances #{Time.now.strftime "%Y%m%d"}"

ws = sheet.worksheets.first
ws.title=("Base Info")

put_headers(ws,["Name","IP Address","Run List","Recipes","Up Time","Ohai     Time","Provider"])

i = 1
nodes.each do |node|
  i += 1
  ws[i,1] = node.name
  ws[i,2] = node.cloud.public_ips
  ws[i,3] = node.run_list.to_s
  ws[i,4] = ( node.node.run_list.expand.recipes * " " )
  ws[i,5] = node.uptime
  hours, minutes, seconds = time_difference_in_hms(node["ohai_time"])
  hours_text   = "#{hours} hour#{hours == 1 ? ' ' : 's'}"
  minutes_text = "#{minutes} minute#{minutes == 1 ? ' ' : 's'}"
  if hours > 24
  text = hours_text
    elsif hours >= 1
      text = hours_text
    else
      text = minutes_text
  end
  ws[i,6] = text
  ws[i,7] = node.cloud.provider
end

ws.save

ws2 = sheet.add_worksheet "EC2 Info" 

put_headers(ws2,["Name","Public Hostname","Availability Zone","Instance Id","Instance Type","Public IP","Local IP","AMI Id","Security Groups"])

i = 1
nodes.each do |node|
  if node.cloud.provider == "ec2" 
    i +=1    
    ws2[i,1] = node.name
    ws2[i,2] = node.ec2.public_hostname
    ws2[i,3] = node.ec2.placement_availability_zone
    ws2[i,4] = node.ec2.instance_id
    ws2[i,5] = node.ec2.instance_type
    ws2[i,6] = node.ec2.public_ipv4
    ws2[i,7] = node.ec2.local_ipv4
    ws2[i,8] = node.ec2.ami_id
    ws2[i,9] =(  node.ec2.security_groups * "," )
  end
end

ws2.save

ws3 = sheet.add_worksheet "Rackspace  Info" 

put_headers(ws3,["Name","Public Hostname","Public IP","Local IP"])

i = 1
nodes.each do |node|
  if node.cloud.provider == "rackspace" 
    i +=1    
    ws3[i,1] = node.name
    ws3[i,2] = node.fqdn
    ws3[i,3] = node.rackspace.public_ip
    ws3[i,4] = node.rackspace.private_ip
  end
end

ws3.save

ws4 = sheet.add_worksheet "System Info" 

put_headers(ws4,["Name","Machine","OS","Version","Release","Platform Version","Memory Total","Memory Free","Buffers","Cached"])

i = 1
nodes.each do |node|
    i +=1    
    ws4[i,1] = node.name
    ws4[i,2] = node.kernel.machine
    ws4[i,3] = node.kernel.name
    ws4[i,4] = node.kernel.os
    ws4[i,5] = node.kernel.version
    ws4[i,6] = node.kernel.release
    ws4[i,7] = node.platform_version
    ws4[i,8] = node.memory.total
    ws4[i,9] = node.memory.free
    ws4[i,10] = node.memory.buffers
    ws4[i,11] = node.memory.cached
end

ws4.save

exit 0

Here is an example google spreadsheet created by this report

Google Report

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment