def run
require 'fog'
require 'highline'
require 'net/ssh/multi'
require 'readline'
connection = Fog::Rackspace::Servers.new(
:rackspace_api_key => Chef::Config[:knife][:rackspace_api_key],
:rackspace_username => Chef::Config[:knife][:rackspace_api_username]
)
server = connection.servers.new
server.flavor_id = config[:flavor]
server.image_id = config[:image]
server.name = config[:server_name]
server.personality = [
{
'path' => '/etc/install-chef',
'contents' => "#!/bin/bash\n# Customized rc.local for chef installation\n\nif [ ! -f /usr/bin/chef-client ]; then\napt-get update\napt-get install -y ruby ruby1.8-dev build-essential wget libruby-extras libruby1.8-extras\ncd /tmp\nwget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz\ntar xvf rubygems-1.3.6.tgz\ncd rubygems-1.3.6\nruby setup.rb\ncp /usr/bin/gem1.8 /usr/bin/gem\ngem install chef ohai --no-rdoc --no-ri --verbose\nfi\n\nexit 0\n"
},
{
'path' => "/etc/chef/validation.pem",
'contents' => IO.read(Chef::Config[:validation_key])
},
{
'path' => "/etc/chef/client.rb",
'contents' => "log_level :info\nlog_location STDOUT\nchef_server_url \"\#{Chef::Config[:chef_server_url]}\"\nvalidation_client_name \"\#{Chef::Config[:validation_client_name]}\"\n"
},
{
'path' => "/etc/chef/first-boot.json",
'contents' => { "run_list" => @name_args }.to_json
},
]
server.save
$stdout.sync = true
puts "#{h.color("Name", :cyan)}: #{server.name}"
puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
puts "#{h.color("Image", :cyan)}: #{server.image_id}"
puts "#{h.color("Public Address", :cyan)}: #{server.addresses["public"]}"
puts "#{h.color("Private Address", :cyan)}: #{server.addresses["private"]}"
puts "#{h.color("Password", :cyan)}: #{server.password}"
print "\n#{h.color("Requesting server", :magenta)}"
saved_password = server.password
server.wait_for { print "."; ready? }
puts "\nServer ready, waiting 15 seconds to bootstrap."
sleep 15
puts "\nBootstrapping #{h.color(server.name, :bold)}..."
ssh = Chef::Knife::Ssh.new
ssh.name_args = [ server.addresses["public"][0], "/bin/bash /etc/install-chef && /usr/bin/chef-client -j /etc/chef/first-boot.json" ]
ssh.config[:ssh_user] = "root"
ssh.config[:manual] = true
ssh.config[:ssh_password] = saved_password
ssh.password = saved_password
ssh.run
end