Pulling information from puppet stored config DB, part 2
In my previous post, I started exploring how to pull information from a puppet stored config DB to use in capistrano, inspired by joe-mac's post.
Well, it seems that the query I used was overly complex. Here's the simplified version:
select h.name from hosts h join resources r on h.id = r.host_id where r.restype = 'Class' and r.title = 'site::profile::dnscache::local' order by h.name;
Having established this, I then modified joe-mac's ruby script to look up based on Class rather than facts. Here's the modified script:
#!/usr/bin/env ruby
require 'getoptlong'
require 'puppet'
require 'rdoc/usage'
ActiveRecord::Base.establish_connection(
:adapter => 'mysql',
:database => 'puppet',
:host => 'localhost',
:password => 'secret',
:username => 'puppet'
)
class Hosts < Puppet::Rails::Host; end
opts = GetoptLong.new(
[ '--class', '-c', GetoptLong::REQUIRED_ARGUMENT],
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
[ '--print', '-p', GetoptLong::REQUIRED_ARGUMENT]
)
printtype = "name"
opt_hash = Hash.new()
opts.each do |opt, arg|
case opt
when '--class'
opt_hash['class'] = arg
when '--help'
RDoc::usage
when '--print'
printtype = arg
end
end
query = "(resources.restype = \'Class\' AND resources.title = \'#{opt_hash['class']}\')"
puts Hosts.find(:all,
:include => [ :resources ],
:conditions => query
).map { |host| host.send(printtype) }
Next step: build this into my capistrano configuration as per joe-mac's example.


