Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@veszig
Created May 8, 2010 22:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save veszig/394812 to your computer and use it in GitHub Desktop.
Save veszig/394812 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby
## manage rackspace cloud chef nodes -- w/o error handling for the time being :)
require 'rubygems'
require 'yaml'
require 'fog'
def create(name, flavor, image, key, chef_server_url)
image_id = image =~ /\A\d+\Z/ ? image : image_id_by_name(image)
flavor_id = flavor =~ /\A[1-7]\Z/ ? flavor : flavor_id_by_memory_size(flavor)
server = connection.servers.new
server.name = name
server.flavor_id = flavor_id.to_i
server.image_id = image_id.to_i
server.personality = [
{
'path' => '/etc/chef/client.rb',
'contents' => "
log_level :info
log_location '/var/log/chef/client.log'
ssl_verify_mode :verify_none
chef_server_url '#{chef_server_url}'
file_cache_path '/var/lib/chef/cache'
pid_file '/var/run/chef/client.pid'
Mixlib::Log::Formatter.show_time = true
file_backup_path '/var/lib/chef/backup'".strip.gsub(/^\s+/,'') + "\n"
},
{
'path' => '/etc/chef/client.pem',
'contents' => IO.read(key).strip + "\n"
}
]
if server.save
puts "[#{server.status} ##{server.id}] #{server.name} @ #{server.addresses['public'][0]} (flavor: #{server.flavor_id}, image: #{server.image_id})"
else
puts "[ERROR] server save failed (name: #{server.name}, flavor_id: #{server.flavor_id}, image_id: #{server.image_id})"
end
end
def destroy(server)
server_id = server =~ /\A\d+\Z/ ? server : server_id_by_name(server)
if s = connection.servers.get(server_id)
puts s.destroy ? "Destroyed #{server}" : "[ERROR] server destroy failed"
else
puts "[ERROR] server not found (server: #{server}, server_id: #{server_id})"
end
end
def list
connection.servers.each { |server|
puts "[#{server.status} ##{server.id}] #{server.name} @ #{server.addresses['public'][0]} (flavor: #{server.flavor_id}, image: #{server.image_id})"
}
end
def connection
return @connection if @connection
# touch ~/.rackspace_cloud_credentials.yml
# chmod 0600 ~/.rackspace_cloud_credentials.yml
# echo -e "username: veszig\napi_key: SECRET" > ~/.rackspace_cloud_credentials.yml
credentials = YAML.load_file(File.expand_path('~/.rackspace_cloud_credentials.yml'))
@connection = Fog::Rackspace::Servers.new(
:rackspace_api_key => credentials['api_key'],
:rackspace_username => credentials['username']
)
end
def image_id_by_name(image_name)
connection.list_images.body['images'].select { |i| i['name'] == image_name }[0]['id']
end
def flavor_id_by_memory_size(memory_size)
connection.flavors.select { |f| f.ram == memory_size.to_i }[0].id
end
def server_id_by_name(server_name)
connection.servers.select { |s| s.name == server_name }[0].id
end
action = ARGV.shift
if %w(help --help -h).include?(action)
puts "Use the source, Luke.
Examples:
rsc create --name foo.done.hu \\
--flavor 512 \\
--image gentoo-chef-client-0.8.16-20100515 \\
--key ~/.chef/foo.done.hu.key \\
--server-url https://chef.done.hu:4443
rsc create -n bar.done.hu -f 1
rsc list
rsc destroy foobar.done.hu
rsc destroy 217309
"
elsif action == 'list'
list
elsif action == 'destroy'
name = ARGV.shift
while %w(-n --name).include?(name)
name = ARGV.shift
end
destroy(name)
elsif action == 'create'
require 'getoptlong'
opts = GetoptLong.new(
[ '--name', '-n', GetoptLong::REQUIRED_ARGUMENT ],
[ '--flavor', '-f', GetoptLong::OPTIONAL_ARGUMENT ],
[ '--image', '-i', GetoptLong::OPTIONAL_ARGUMENT ],
[ '--key', '-k', GetoptLong::OPTIONAL_ARGUMENT ],
[ '--server-url', '-s', GetoptLong::OPTIONAL_ARGUMENT ]
)
name = flavor = image = key = server = nil
opts.each { |opt, arg|
case opt
when '--name'
name = arg
when '--flavor'
flavor = arg
when '--image'
image = arg
when '--key'
key = arg
when '--server-url'
server = arg
end
}
flavor = '1' if flavor.to_s == "" # 256MB
image = 'gentoo-chef-client-0.8.16-20100515' if image.to_s == ""
key = File.expand_path("~/.chef/#{name}.key") if key.to_s == ""
server = 'https://chef.done.hu:4443' if server.to_s == ""
create(name, flavor, image, key, server)
else
puts "Don't know how to do \"#{action}\""
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment