-
-
Save renemendoza/660351 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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