1 package Oyster::Provision::Rackspace;
4 use Net::RackSpace::CloudServers;
5 use Net::RackSpace::CloudServers::Server;
10 has 'api_username' => ( is => 'ro', isa => 'Str', required => 1, lazy_build => 1);
11 sub _build_api_username {
12 return $ENV{CLOUDSERVERS_USER} if exists $ENV{CLOUDSERVERS_USER};
13 confess "Need api_username or CLOUDSERVERS_USER in environment";
16 has 'api_password' => ( is => 'ro', isa => 'Str', required => 1, lazy_build => 1);
17 sub _build_api_password {
18 return $ENV{CLOUDSERVERS_KEY} if exists $ENV{CLOUDSERVERS_KEY};
19 confess "Need api_password or CLOUDSERVERS_KEY in environment";
22 has '_rs' => ( is => 'rw', isa => 'Net::RackSpace::CloudServers', default => sub {
24 my $rs = Net::RackSpace::CloudServers->new(
25 user => $self->api_username,
26 key => $self->api_password,
34 # Do nothing if the server named $self->name already exists
35 return if scalar grep { $_->name eq $self->name } $self->_rs->get_server();
37 # Check the ssh pub key exists and is <10K
38 confess "SSH pubkey needs to exist" if !-f $self->pub_ssh;
41 open my $fh, '<', $self->pub_ssh or die "Cannot open ", $self->pub_ssh, ": $!";
43 close $fh or die "Cannot close ", $self->pub_ssh, ": $!";
46 confess "SSH pubkey needs to be < 10KiB" if length $pub_ssh > 10*1024;
49 my $server = Net::RackSpace::CloudServers::Server->new(
50 cloudservers => $self->_rs,
52 flavor => $self->size,
53 image => $self->image,
56 path => $self->pub_ssh,
57 contents => encode_base64($pub_ssh),
61 $server->create_server;
63 warn "Server public IP is: ", ($server->public_address)[0], "\n";
64 warn "Server root password: ", $server->adminpass, "\n";
66 # Connect to server and execute installation routines?
73 # Die if the server named $self->name already exists
74 my ($server) = grep { $_->name eq $self->name } $self->_rs->get_server();
75 confess "No such server: ", $self->name if !$server;
78 $server->delete_server();
93 Oyster::Provision::Rackspace -- Provision your Oyster on Rackspace
97 Use the Rackspace backend on your Oyster configuration file
99 =head1 REQUIRED PARAMETERS
101 The following are required to instantiate a backend:
107 The rackspace API username, or C<$ENV{RACKSPACE_USER}> will be used if that is
112 This is your rackspace API Key
114 The rackspace API key, or C<$ENV{RACKSPACE_KEY}> will be used if that is not
119 The name of your new/existing rackspace server.
123 The size ID of the rackspace server you want to create.
124 Use the following incantation to see them:
126 perl -MNet::RackSpace::CloudServers -e'
127 $r=Net::RackSpace::CloudServers->new(
128 user=>$ENV{CLOUDSERVERS_USER},
129 key=>$ENV{CLOUDSERVERS_KEY},
132 { "id $_->{id} ram $_->{ram} disk $_->{disk}\n" }
133 $r->get_flavor_detail
137 id 3 ram 1024 disk 40
138 id 4 ram 2048 disk 80
139 id 5 ram 4096 disk 160
140 id 6 ram 8192 disk 320
141 id 7 ram 15872 disk 620
145 The image ID of the rackspace server you want to create.
146 Use the following incantation to see them:
148 perl -MNet::RackSpace::CloudServers -e'
149 $r=Net::RackSpace::CloudServers->new(
150 user=>$ENV{CLOUDSERVERS_USER},
151 key=>$ENV{CLOUDSERVERS_KEY},
154 { "id $_->{id} name $_->{name}\n" }
157 id 29 name Windows Server 2003 R2 SP2 x86
158 id 69 name Ubuntu 10.10 (maverick)
159 id 41 name Oracle EL JeOS Release 5 Update 3
160 id 40 name Oracle EL Server Release 5 Update 4
161 id 187811 name CentOS 5.4
162 id 4 name Debian 5.0 (lenny)
163 id 10 name Ubuntu 8.04.2 LTS (hardy)
164 id 23 name Windows Server 2003 R2 SP2 x64
165 id 24 name Windows Server 2008 SP2 x64
166 id 49 name Ubuntu 10.04 LTS (lucid)
167 id 14362 name Ubuntu 9.10 (karmic)
168 id 62 name Red Hat Enterprise Linux 5.5
172 id 31 name Windows Server 2008 SP2 x86
173 id 51 name CentOS 5.5
174 id 14 name Red Hat Enterprise Linux 5.4
175 id 19 name Gentoo 10.1
176 id 28 name Windows Server 2008 R2 x64
177 id 55 name Arch 2010.05
179 Oyster only supports Linux images, specifically
180 Ubuntu 10.10 (maverick).
184 The public ssh key you would like copied to the
185 new server's C</root/.ssh/authorized_keys> file
186 to allow you to ssh in the box without providing