Project

General

Profile

Download (1.7 KB) Statistics
| Branch: | Tag: | Revision:
# TRANSLATORS: do not translate
desc <<-END_DESC
Try to figure out the out of sync hosts real status

try to search them by DNS lookups and ping, if a host is not in DNS it will allow you to delete it.

legend:
"." - pingable
"x" - no ping response

Example:
rake hosts:scan_out_of_sync RAILS_ENV="production"

END_DESC

namespace :hosts do
task :scan_out_of_sync => :environment do
require 'ping'
require 'resolv'

def printhosts(list, description)
unless list.empty?
puts
puts "found #{list.size} #{description} hosts:"
puts "Name".ljust(40)+"Environment".ljust(20)+"Last Report"
puts "#{"*"*80}"
list.each do |h|
puts h.name.ljust(40) + h.environment.to_s.ljust(20) + h.last_report.to_s(:short)
end
end
end

pingable = []
missingdns = []
offline = []

Host.out_of_sync(1.hour.ago).all(:order => 'environment_id asc').collect do |host|
$stdout.flush
ip = Resolv::DNS.new.getaddress(host.name).to_s rescue nil
if ip.empty?
missingdns << host
else
puts "conflict IP address for #{host.name}" unless ip == host.ip
if Ping.pingecho host.ip
print "."
pingable << host
else
print "x"
offline << host
end
end
end
puts
if missingdns.empty?
puts "All out of sync hosts exists in DNS"
else
printhosts(missingdns, "hosts with no DNS entry")
puts "ctrl-c to abort - any other key to remove these hosts"
$stdin.gets

missingdns.each {|h| h.destroy }
end

printhosts(offline, "offline hosts")
printhosts(pingable, "online hosts which are not running puppet")
end
end
(11-11/29)