1 package Oyster::Provision::Rackspace;
3 use Net::RackSpace::CloudServers;
4 use Net::RackSpace::CloudServers::Server;
7 # TODO http://failverse.com/manually-creating-a-cloud-server-from-a-cloud-files-image/
8 # in order to use an already created image to build the server, a la EC2 way
12 has 'api_username' => ( is => 'ro', isa => 'Str', required => 1, lazy_build => 1);
13 sub _build_api_username {
15 return $ENV{CLOUDSERVERS_USER} if exists $ENV{CLOUDSERVERS_USER};
16 return $self->config->{api_username}
17 or die "Need api_username or CLOUDSERVERS_USER in environment";
20 has 'api_password' => ( is => 'ro', isa => 'Str', required => 1, lazy_build => 1);
21 sub _build_api_password {
23 return $ENV{CLOUDSERVERS_KEY} if exists $ENV{CLOUDSERVERS_KEY};
24 return $self->config->{api_password}
25 or die "Need api_password or CLOUDSERVERS_KEY in environment";
28 has '_rs' => ( is => 'rw', isa => 'Net::RackSpace::CloudServers', default => sub {
30 my $rs = Net::RackSpace::CloudServers->new(
31 user => $self->api_username,
32 key => $self->api_password,
40 # Do nothing if the server named $self->name already exists
41 return if scalar grep { $_->name eq $self->name } $self->_rs->get_server();
43 # Check the ssh pub key exists and is <10K
44 die "SSH pubkey needs to exist" if !-f $self->pub_ssh;
47 open my $fh, '<', $self->pub_ssh or die "Cannot open ", $self->pub_ssh, ": $!";
49 close $fh or die "Cannot close ", $self->pub_ssh, ": $!";
52 die "SSH pubkey needs to be < 10KiB" if length $pub_ssh > 10*1024;
55 my $server = Net::RackSpace::CloudServers::Server->new(
56 cloudservers => $self->_rs,
58 flavorid => $self->size,
59 imageid => $self->image,
62 path => '/root/.ssh/authorized_keys',
63 contents => encode_base64($pub_ssh),
67 my $newserver = $server->create_server;
68 warn "Server root password: ", $newserver->adminpass, "\n";
72 my @tmpservers = $self->_rs->get_server_detail();
73 $server = ( grep { $_->name eq $self->name } @tmpservers )[0];
74 print "\rServer status: ", ($server->status || '?'), " progress: ", ($server->progress || '?');
75 if ( ( $server->status // '' ) ne 'ACTIVE' ) {
79 } while ( ( $server->status // '' ) ne 'ACTIVE' );
81 warn "Server public IP is: @{$server->public_address}\n";
83 # Connect to server and execute installation routines?
90 # Die if the server named $self->name already exists
91 my ($server) = grep { $_->name eq $self->name } $self->_rs->get_server();
92 die "No such server: ", $self->name if !$server;
95 $server->delete_server();
110 Oyster::Provision::Rackspace -- Provision your Oyster on Rackspace
114 Use the Rackspace backend on your Oyster configuration file
116 =head1 REQUIRED PARAMETERS
118 The following are required to instantiate a backend:
124 The rackspace API username, or C<$ENV{RACKSPACE_USER}> will be used if that is
129 This is your rackspace API Key
131 The rackspace API key, or C<$ENV{RACKSPACE_KEY}> will be used if that is not
136 The name of your new/existing rackspace server.
140 The size ID of the rackspace server you want to create.
141 Use the following incantation to see them:
143 perl -MNet::RackSpace::CloudServers -e'
144 $r=Net::RackSpace::CloudServers->new(
145 user=>$ENV{CLOUDSERVERS_USER},
146 key=>$ENV{CLOUDSERVERS_KEY},
149 { "id $_->{id} ram $_->{ram} disk $_->{disk}\n" }
150 $r->get_flavor_detail
154 id 3 ram 1024 disk 40
155 id 4 ram 2048 disk 80
156 id 5 ram 4096 disk 160
157 id 6 ram 8192 disk 320
158 id 7 ram 15872 disk 620
162 The image ID of the rackspace server you want to create.
163 Use the following incantation to see them:
165 perl -MNet::RackSpace::CloudServers -e'
166 $r=Net::RackSpace::CloudServers->new(
167 user=>$ENV{CLOUDSERVERS_USER},
168 key=>$ENV{CLOUDSERVERS_KEY},
171 { "id $_->{id} name $_->{name}\n" }
174 id 29 name Windows Server 2003 R2 SP2 x86
175 id 69 name Ubuntu 10.10 (maverick)
176 id 41 name Oracle EL JeOS Release 5 Update 3
177 id 40 name Oracle EL Server Release 5 Update 4
178 id 187811 name CentOS 5.4
179 id 4 name Debian 5.0 (lenny)
180 id 10 name Ubuntu 8.04.2 LTS (hardy)
181 id 23 name Windows Server 2003 R2 SP2 x64
182 id 24 name Windows Server 2008 SP2 x64
183 id 49 name Ubuntu 10.04 LTS (lucid)
184 id 14362 name Ubuntu 9.10 (karmic)
185 id 62 name Red Hat Enterprise Linux 5.5
189 id 31 name Windows Server 2008 SP2 x86
190 id 51 name CentOS 5.5
191 id 14 name Red Hat Enterprise Linux 5.4
192 id 19 name Gentoo 10.1
193 id 28 name Windows Server 2008 R2 x64
194 id 55 name Arch 2010.05
196 Oyster only supports Linux images, specifically
197 Ubuntu 10.10 (maverick).
201 The public ssh key you would like copied to the
202 new server's C</root/.ssh/authorized_keys> file
203 to allow you to ssh in the box without providing