rudy 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.txt +53 -3
- data/README.rdoc +9 -5
- data/bin/rudy +115 -292
- data/bin/rudy-ec2 +107 -0
- data/lib/console.rb +322 -278
- data/lib/rudy.rb +78 -55
- data/lib/rudy/aws/ec2.rb +63 -5
- data/lib/rudy/command/addresses.rb +18 -13
- data/lib/rudy/command/backups.rb +175 -0
- data/lib/rudy/command/base.rb +664 -146
- data/lib/rudy/command/config.rb +77 -0
- data/lib/rudy/command/deploy.rb +12 -0
- data/lib/rudy/command/disks.rb +165 -195
- data/lib/rudy/command/environment.rb +42 -64
- data/lib/rudy/command/groups.rb +21 -19
- data/lib/rudy/command/images.rb +34 -19
- data/lib/rudy/command/instances.rb +46 -92
- data/lib/rudy/command/machines.rb +161 -0
- data/lib/rudy/command/metadata.rb +14 -30
- data/lib/rudy/command/release.rb +174 -0
- data/lib/rudy/command/volumes.rb +26 -10
- data/lib/rudy/config.rb +93 -0
- data/lib/rudy/metadata/backup.rb +1 -1
- data/lib/rudy/metadata/disk.rb +15 -50
- data/lib/rudy/scm/svn.rb +32 -21
- data/lib/rudy/utils.rb +2 -3
- data/lib/storable.rb +4 -0
- data/lib/tryouts.rb +40 -0
- data/rudy.gemspec +25 -9
- data/support/mailtest +40 -0
- data/support/rudy-ec2-startup +41 -15
- data/tryouts/console_tryout.rb +91 -0
- metadata +86 -11
- data/lib/drydock.rb +0 -524
- data/lib/rudy/command/stage.rb +0 -45
- data/lib/rudy/metadata/config.rb +0 -8
- data/lib/rudy/metadata/environment.rb +0 -0
@@ -1,86 +1,64 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
# :role:
|
7
|
-
# :env:
|
8
|
-
# :access_key:
|
9
|
-
# :secret_key:
|
10
|
-
# :dbmachine:
|
11
|
-
|
12
|
-
|
13
4
|
module Rudy
|
14
5
|
module Command
|
15
6
|
class Environment < Rudy::Command::Base
|
16
7
|
|
8
|
+
#---
|
9
|
+
# TODO: http://net-ssh.rubyforge.org/ssh/v1/chapter-4.html
|
10
|
+
#+++
|
17
11
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
# useful on an instance itself).
|
25
|
-
#
|
26
|
-
# # Display the default value.
|
27
|
-
# $ rudy config -d param-name
|
28
|
-
#
|
29
|
-
# # Display the value for a specific machine.
|
30
|
-
# $ rudy -e prod -r db config param-name
|
31
|
-
#
|
32
|
-
# # Display all configuration
|
33
|
-
# $ rudy config --all
|
34
|
-
#
|
35
|
-
def config(name=nil)
|
36
|
-
return unless @config.exists?
|
37
|
-
puts "Config: #{@config.path}" if @verbose > 0
|
38
|
-
|
39
|
-
|
40
|
-
which = @defaults ? @user : machine_name
|
41
|
-
puts "Machine: #{which}" if @verbose > 0
|
42
|
-
|
43
|
-
return unless @config.userdata && @config.userdata.is_a?(Hash)
|
44
|
-
#return unless @config.userdata[which] && @config.userdata[which].is_a?(Hash)
|
45
|
-
|
46
|
-
# The .rudy config files have a different structure.
|
47
|
-
# There's no userdata -> which. Just the config settings.
|
48
|
-
if Rudy.in_situ?
|
49
|
-
if name && @config.userdata.has_key?(name)
|
50
|
-
puts @config.userdata[name]
|
51
|
-
else
|
52
|
-
puts @config.to_yaml
|
53
|
-
end
|
12
|
+
|
13
|
+
def connect
|
14
|
+
check_keys
|
15
|
+
machine = find_current_machine
|
16
|
+
if @argv.cmd
|
17
|
+
cmd = @argv.cmd.is_a?(Array) ? @argv.cmd.join(' ') : @argv.cmd
|
54
18
|
else
|
55
|
-
|
56
|
-
value = @config.userdata[which][name.to_s]
|
57
|
-
puts value if value
|
58
|
-
elsif @all
|
59
|
-
puts @config.to_yaml
|
60
|
-
else
|
61
|
-
value = @config.userdata[which]
|
62
|
-
puts value.to_yaml if value
|
63
|
-
end
|
19
|
+
cmd = false
|
64
20
|
end
|
65
21
|
|
66
|
-
|
22
|
+
puts ssh_command(machine[:dns_name], keypairpath, @global.user, cmd, @option.print)
|
67
23
|
|
68
|
-
|
69
|
-
|
24
|
+
end
|
25
|
+
|
26
|
+
def copy_valid?
|
70
27
|
check_keys
|
71
|
-
|
72
|
-
|
28
|
+
raise "No path specified (rudy copy FROM-PATH [FROM-PATH ...] TO-PATH)" unless argv.size >= 2
|
29
|
+
true
|
73
30
|
end
|
74
31
|
|
75
32
|
# +paths+ an array of paths to copy. The last element is the "to" path.
|
76
|
-
def copy
|
77
|
-
check_keys
|
33
|
+
def copy
|
78
34
|
machine = find_current_machine
|
35
|
+
|
36
|
+
paths = @argv
|
37
|
+
dest_path = paths.pop
|
38
|
+
|
39
|
+
if @option.print
|
40
|
+
scp_command machine[:dns_name], keypairpath, @global.user, paths, dest_path, @option.remote, false, @option.print
|
41
|
+
return
|
42
|
+
end
|
79
43
|
|
80
|
-
|
81
|
-
|
44
|
+
@option.remote = true if @alias == 'download'
|
45
|
+
@option.remote = false if @alias == 'upload'
|
82
46
|
|
83
|
-
|
47
|
+
if @alias == 'scp' || @alias == 'copy'
|
48
|
+
@alias = 'download' if @option.remote
|
49
|
+
@alias = 'upload' unless @option.remote
|
50
|
+
end
|
51
|
+
|
52
|
+
scp do |scp|
|
53
|
+
transfers = paths.collect { |path|
|
54
|
+
scp.send(@alias, path, dest_path) do |ch, name, sent, total|
|
55
|
+
#TODO: Nice printing in place
|
56
|
+
#puts "#{name}: #{sent}/#{total}"
|
57
|
+
end
|
58
|
+
|
59
|
+
}
|
60
|
+
transfers.each { |trans| trans.wait }
|
61
|
+
end
|
84
62
|
end
|
85
63
|
|
86
64
|
|
data/lib/rudy/command/groups.rb
CHANGED
@@ -5,51 +5,53 @@ module Rudy
|
|
5
5
|
module Command
|
6
6
|
class Groups < Rudy::Command::Base
|
7
7
|
|
8
|
-
def
|
9
|
-
name = machine_group if name.nil? && !@all
|
8
|
+
def groups(name=@argv.first)
|
9
|
+
name = machine_group if name.nil? && !@option.all
|
10
10
|
@ec2.groups.list(name).each do |grp|
|
11
11
|
print_group grp
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
name
|
15
|
+
def create_groups(name=@argv.first)
|
16
|
+
name ||= machine_group
|
17
|
+
puts "Creating group #{name}"
|
17
18
|
raise "The group #{name} already exists" if @ec2.groups.exists?(name)
|
18
19
|
|
19
|
-
puts "Creating group #{name}"
|
20
20
|
@ec2.groups.create(name)
|
21
21
|
|
22
|
-
|
22
|
+
modify_groups name
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
name
|
25
|
+
def modify_groups(name=@argv.first)
|
26
|
+
name ||= machine_group
|
27
27
|
raise "The group #{name} does not exist" unless @ec2.groups.exists?(name)
|
28
28
|
|
29
|
-
@addresses
|
30
|
-
@ports
|
31
|
-
@protocols
|
29
|
+
@option.addresses ||= [Rudy::Utils::external_ip_address]
|
30
|
+
@option.ports ||= [22,80,443]
|
31
|
+
@option.protocols ||= ["tcp"]
|
32
32
|
|
33
33
|
# Make sure the IP addresses have ranges
|
34
|
-
@addresses.collect! { |ip| (ip.match /\/\d+/) ? ip : "#{ip}/32" }
|
34
|
+
@option.addresses.collect! { |ip| (ip.match /\/\d+/) ? ip : "#{ip}/32" }
|
35
35
|
|
36
|
-
@protocols.each do |protocol|
|
37
|
-
puts "Adding ports #{@ports.join(',')} (#{protocol}) for #{@addresses.join(', ')}"
|
38
|
-
@addresses.each do |address|
|
39
|
-
@ports.each do |port|
|
36
|
+
@option.protocols.each do |protocol|
|
37
|
+
puts "Adding ports #{@option.ports.join(',')} (#{protocol}) for #{@option.addresses.join(', ')}"
|
38
|
+
@option.addresses.each do |address|
|
39
|
+
@option.ports.each do |port|
|
40
40
|
@ec2.groups.modify(name, port, port, protocol, address)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
groups name
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
48
|
+
def destroy_groups(name=@argv.first)
|
49
|
+
name ||= machine_group
|
50
|
+
puts "Destroying group #{name}"
|
49
51
|
name = machine_group if name.nil?
|
50
52
|
raise "The group #{name} does not exist" unless @ec2.groups.exists?(name)
|
53
|
+
exit unless are_you_sure?
|
51
54
|
|
52
|
-
puts "Destroying group #{name}"
|
53
55
|
@ec2.groups.destroy(name)
|
54
56
|
|
55
57
|
end
|
data/lib/rudy/command/images.rb
CHANGED
@@ -5,18 +5,32 @@ module Rudy
|
|
5
5
|
class Images < Rudy::Command::Base
|
6
6
|
|
7
7
|
|
8
|
-
def
|
8
|
+
def images
|
9
9
|
@ec2.images.list.each do |img|
|
10
10
|
print_image img
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def create_images_valid?
|
15
|
+
puts "Make sure the machine is clean. I don't want archive no crud!"
|
16
|
+
exit unless are_you_sure?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def prepare_images
|
22
|
+
# TODO: Avail hooks for clean an instance
|
23
|
+
# Clean off Rudy specific crap.
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def create_images
|
15
28
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
29
|
+
switch_user("root")
|
30
|
+
|
31
|
+
puts "TODO: clean transient rudy crap off of instance before making image!!!"
|
32
|
+
# ~/.rudy, /etc/motd, history -c, /etc/hosts, /var/log/rudy*
|
33
|
+
exit
|
20
34
|
|
21
35
|
raise "No EC2 .pem keys provided" unless has_pem_keys?
|
22
36
|
raise "No SSH key provided for #{keypairname}!" unless has_keypair?(keypairname)
|
@@ -30,33 +44,34 @@ module Rudy
|
|
30
44
|
|
31
45
|
puts "The new image will be based on #{machine_group}_01"
|
32
46
|
|
33
|
-
@account ||= @account_num
|
47
|
+
@option.account ||= @global.account_num
|
34
48
|
|
35
|
-
unless @account
|
49
|
+
unless @global.account
|
36
50
|
puts "Enter your 12 digit Amazon account number:"
|
37
|
-
@account = gets.chomp
|
51
|
+
@global.account = gets.chomp
|
38
52
|
end
|
39
53
|
|
40
|
-
unless @image_name
|
54
|
+
unless @option.image_name
|
41
55
|
puts "Enter the image name:"
|
42
|
-
@image_name = gets.chomp
|
56
|
+
@option.image_name = gets.chomp
|
43
57
|
end
|
44
58
|
|
45
|
-
unless @bucket_name
|
59
|
+
unless @option.bucket_name
|
46
60
|
puts "Enter the S3 bucket that will store the image:"
|
47
|
-
@bucket_name = gets.chomp
|
61
|
+
@option.bucket_name = gets.chomp
|
48
62
|
end
|
49
63
|
|
50
|
-
|
51
|
-
|
64
|
+
scp_command machine[:dns_name], keypairpath, @global.user, @global.cert, "/mnt/"
|
65
|
+
scp_command machine[:dns_name], keypairpath, @global.user, @global.privatekey, "/mnt/"
|
52
66
|
|
53
|
-
|
54
|
-
|
67
|
+
ssh_command machine[:dns_name], keypairpath, @global.user, "ec2-bundle-vol -r i386 -p #{@option.image_name} -k /mnt/pk-*pem -c /mnt/cert*pem -u #{@option.account}"
|
68
|
+
ssh_command machine[:dns_name], keypairpath, @global.user, "ec2-upload-bundle -b #{@option.bucket_name} -m /tmp/#{@option.image_name}.manifest.xml -a #{@global.accesskey} -s #{@global.secretkey}"
|
55
69
|
|
56
|
-
@ec2.images.register("#{@bucket_name}/#{@image_name}.manifest.xml")
|
70
|
+
@ec2.images.register("#{@option.bucket_name}/#{@option.image_name}.manifest.xml")
|
57
71
|
end
|
58
72
|
|
59
|
-
def deregister
|
73
|
+
def deregister
|
74
|
+
ami = @argv.first
|
60
75
|
raise "You must supply an AMI ID (ami-XXXXXXX)" unless ami
|
61
76
|
puts "Deregistering AMI: #{ami}"
|
62
77
|
|
@@ -1,11 +1,42 @@
|
|
1
|
-
|
1
|
+
#
|
2
|
+
#
|
3
|
+
#
|
4
|
+
#
|
5
|
+
#
|
6
|
+
#
|
7
|
+
#
|
8
|
+
#
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
2
12
|
|
3
13
|
module Rudy
|
4
14
|
module Command
|
5
15
|
class Instances < Rudy::Command::Base
|
6
16
|
|
7
|
-
def
|
8
|
-
|
17
|
+
def restart_instances_valid?
|
18
|
+
raise "No instance ID provided" if @argv.filter.nil?
|
19
|
+
raise "No EC2 .pem keys provided" unless has_pem_keys?
|
20
|
+
raise "No SSH key provided for #{@global.user}!" unless has_keypair?
|
21
|
+
raise "No SSH key provided for root!" unless has_keypair?(:root)
|
22
|
+
|
23
|
+
|
24
|
+
@list = @ec2.instances.list(machine_group)
|
25
|
+
raise "#{@argv.filter} is not in the current machine group" unless @list.has_key?(@argv.filter)
|
26
|
+
|
27
|
+
raise "I will not help you destroy production!" if @global.environment == "prod" # TODO: use_caution?, locked?
|
28
|
+
|
29
|
+
exit unless are_you_sure?(5)
|
30
|
+
true
|
31
|
+
end
|
32
|
+
def restart_instances
|
33
|
+
puts "Restarting #{@argv.filter}!"
|
34
|
+
@ec2.instances.restart @argv.filter
|
35
|
+
end
|
36
|
+
|
37
|
+
def instances
|
38
|
+
filter = @argv.first
|
39
|
+
filter = machine_group if filter.nil? && !@option.all
|
9
40
|
if instance_id?(filter)
|
10
41
|
inst = @ec2.instances.get(filter)
|
11
42
|
raise "The instance #{filter} does not exist" if inst.empty?
|
@@ -26,9 +57,17 @@ module Rudy
|
|
26
57
|
|
27
58
|
end
|
28
59
|
|
29
|
-
def
|
30
|
-
|
31
|
-
raise "
|
60
|
+
def destroy_instances_valid?
|
61
|
+
filter = argv.first
|
62
|
+
raise "No instance ID provided" if filter.nil?
|
63
|
+
raise "I will not help you destroy production!" if @global.environment == "prod" || filter =~ /^prod/
|
64
|
+
exit unless are_you_sure?
|
65
|
+
true
|
66
|
+
end
|
67
|
+
|
68
|
+
def destroy_instances
|
69
|
+
filter = argv.first
|
70
|
+
|
32
71
|
if @ec2.groups.exists?(filter)
|
33
72
|
list = @ec2.instances.list(filter)
|
34
73
|
raise "The group #{filter} has no running instances" if list.empty?
|
@@ -39,92 +78,7 @@ module Rudy
|
|
39
78
|
puts "Destroying #{instance}!"
|
40
79
|
@ec2.instances.destroy instance
|
41
80
|
end
|
42
|
-
|
43
|
-
def start_instance
|
44
|
-
@image ||= machine_image
|
45
|
-
|
46
|
-
@user = "root"
|
47
|
-
|
48
|
-
rig = @ec2.instances.list(machine_group)
|
49
|
-
raise "There is already an instance running in #{machine_group}" unless rig.empty?
|
50
|
-
raise "No SSH key provided for #{keypairname}!" unless has_keypair?(keypairname)
|
51
|
-
raise "SSH key provided but cannot be found! (#{keypairpath})" unless File.exists?(keypairpath)
|
52
|
-
|
53
|
-
|
54
|
-
machine_data = {
|
55
|
-
# Give the machine an identity
|
56
|
-
:zone => @zone,
|
57
|
-
:environment => @environment,
|
58
|
-
:role => @role,
|
59
|
-
:position => @position,
|
60
|
-
|
61
|
-
# Add hosts to the /etc/hosts file
|
62
|
-
:hosts => {
|
63
|
-
:dbmaster => "127.0.0.1",
|
64
|
-
},
|
65
|
-
|
66
|
-
:userdata => {}
|
67
|
-
}
|
68
|
-
|
69
|
-
# Populate userdata with settings from ~/.rudy
|
70
|
-
if @config.userdata.is_a?(Hash) && !@config.userdata.empty?
|
71
|
-
# Build a set of parameters for each user on the requested
|
72
|
-
# machine. Set default values first and overwrite. (TODO)
|
73
|
-
@config.userdata.each_pair do |n,hash|
|
74
|
-
user = n # TODO: should be prepared to parse "us-east-1b-stage-app-rudy" and "us-east-1b-stage-app-01-rudy"
|
75
|
-
machine_data[:userdata][user] = hash
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
puts "Starting an instance in #{machine_group}"
|
80
|
-
puts "with userdata:", machine_data.to_yaml
|
81
|
-
|
82
|
-
instances = @ec2.instances.create(@image, machine_group.to_s, File.basename(keypairpath), machine_data.to_yaml, @zone)
|
83
|
-
inst = instances.first
|
84
|
-
id, state = inst[:aws_instance_id], inst[:aws_state]
|
85
|
-
|
86
|
-
if @address
|
87
|
-
puts "Associating #{@address} to #{id}"
|
88
|
-
@ec2.addresses.associate(id, @address)
|
89
|
-
end
|
90
|
-
|
91
|
-
print "Waiting for #{id} to become available"
|
92
|
-
|
93
|
-
while @ec2.instances.pending?(id)
|
94
|
-
sleep 2
|
95
|
-
print '.'
|
96
|
-
STDOUT.flush
|
97
|
-
end
|
98
|
-
|
99
|
-
machine = @ec2.instances.get(id)
|
100
|
-
|
101
|
-
puts " It's up!"
|
102
|
-
print "Waiting for SSH daemon at #{machine[:dns_name]}"
|
103
|
-
while !Rudy::Utils.service_available?(machine[:dns_name], 22)
|
104
|
-
print '.'
|
105
|
-
STDOUT.flush
|
106
|
-
end
|
107
|
-
puts " It's up!"
|
108
|
-
|
109
|
-
print "Looking for disk metadata for #{machine[:aws_availability_zone]}... "
|
110
|
-
disks = Rudy::MetaData::Disk.list(@sdb, machine[:aws_availability_zone], @environment, @role, @position)
|
111
|
-
|
112
|
-
if disks.empty?
|
113
|
-
puts "None"
|
114
|
-
else
|
115
|
-
puts "#{disks.size} disk(s)."
|
116
|
-
disks.each do |disk|
|
117
|
-
|
118
|
-
do_dirty_disk_volume_deeds(disk, machine)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
puts
|
123
|
-
ssh machine[:dns_name], keypairpath, user, "df -h" # Display current mounts
|
124
|
-
puts
|
125
|
-
puts "Done!"
|
126
|
-
end
|
127
|
-
|
81
|
+
|
128
82
|
end
|
129
83
|
end
|
130
84
|
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy
|
4
|
+
module Command
|
5
|
+
class Machines < Rudy::Command::Base
|
6
|
+
|
7
|
+
|
8
|
+
def shutdown_valid?
|
9
|
+
raise "No EC2 .pem keys provided" unless has_pem_keys?
|
10
|
+
raise "No SSH key provided for #{@global.user}!" unless has_keypair?
|
11
|
+
raise "No SSH key provided for root!" unless has_keypair?(:root)
|
12
|
+
|
13
|
+
@list = @ec2.instances.list(machine_group)
|
14
|
+
raise "No machines running in #{machine_group}" unless @list && !@list.empty?
|
15
|
+
|
16
|
+
raise "I will not help you ruin production!" if @global.environment == "prod" # TODO: use_caution?, locked?
|
17
|
+
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def shutdown
|
23
|
+
puts "Shutting down #{machine_group}: #{@list.keys.join(', ')}".att(:bright)
|
24
|
+
switch_user("root")
|
25
|
+
puts "This command also affects the volumes attached to the instances! (according to your routines config)"
|
26
|
+
exit unless are_you_sure?(5)
|
27
|
+
|
28
|
+
execute_routines(@list.values, :shutdown, :before)
|
29
|
+
|
30
|
+
execute_disk_routines(@list.values, :shutdown)
|
31
|
+
|
32
|
+
puts "Terminating instances..."
|
33
|
+
@ec2.instances.destroy @list.keys
|
34
|
+
sleep 5
|
35
|
+
|
36
|
+
execute_routines(@list.values, :shutdown, :after)
|
37
|
+
|
38
|
+
puts "Done!"
|
39
|
+
end
|
40
|
+
|
41
|
+
def startup_valid?
|
42
|
+
rig = @ec2.instances.list(machine_group)
|
43
|
+
raise "There is already an instance running in #{machine_group}" if rig && !rig.empty?
|
44
|
+
raise "No SSH key provided for #{keypairname}!" unless has_keypair?
|
45
|
+
true
|
46
|
+
end
|
47
|
+
def startup
|
48
|
+
puts "Starting a machine in #{machine_group}".att(:bright)
|
49
|
+
switch_user("root")
|
50
|
+
exit unless are_you_sure?(3)
|
51
|
+
|
52
|
+
#execute_routines([], :startup, :before_local)
|
53
|
+
|
54
|
+
@option.image ||= machine_image
|
55
|
+
|
56
|
+
instances = @ec2.instances.create(@option.image, machine_group.to_s, File.basename(keypairpath), machine_data.to_yaml, @global.zone)
|
57
|
+
inst = instances.first
|
58
|
+
|
59
|
+
if @option.address ||= machine_address
|
60
|
+
puts "Associating #{@option.address} to #{inst[:aws_instance_id]}"
|
61
|
+
@ec2.addresses.associate(inst[:aws_instance_id], @option.address)
|
62
|
+
end
|
63
|
+
|
64
|
+
wait_for_machine(inst[:aws_instance_id])
|
65
|
+
inst = @ec2.instances.get(inst[:aws_instance_id])
|
66
|
+
|
67
|
+
#inst = @ec2.instances.list(machine_group).values
|
68
|
+
|
69
|
+
execute_disk_routines(inst, :startup)
|
70
|
+
execute_routines(inst, :startup, :after)
|
71
|
+
|
72
|
+
puts "Done!"
|
73
|
+
end
|
74
|
+
|
75
|
+
def restart_valid?
|
76
|
+
shutdown_valid?
|
77
|
+
end
|
78
|
+
def restart
|
79
|
+
puts "Restarting #{machine_group}: #{@list.keys.join(', ')}".att(:bright)
|
80
|
+
switch_user("root")
|
81
|
+
exit unless are_you_sure?(5)
|
82
|
+
|
83
|
+
@list.each do |id, inst|
|
84
|
+
execute_routines(@list.values, :restart, :before)
|
85
|
+
end
|
86
|
+
|
87
|
+
puts "Restarting instances: #{@list.keys.join(', ')}".att(:bright)
|
88
|
+
@ec2.instances.restart @list.keys
|
89
|
+
sleep 10 # Wait for state to change and SSH to shutdown
|
90
|
+
|
91
|
+
@list.keys.each do |id|
|
92
|
+
wait_for_machine(id)
|
93
|
+
end
|
94
|
+
|
95
|
+
execute_disk_routines(@list.values, :restart)
|
96
|
+
|
97
|
+
@list.each do |id, inst|
|
98
|
+
execute_routines(@list.values, :restart, :after)
|
99
|
+
end
|
100
|
+
|
101
|
+
puts "Done!"
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
def status_valid?
|
106
|
+
raise "No EC2 .pem keys provided" unless has_pem_keys?
|
107
|
+
raise "No SSH key provided for #{@global.user}!" unless has_keypair?
|
108
|
+
raise "No SSH key provided for root!" unless has_keypair?(:root)
|
109
|
+
|
110
|
+
@list = @ec2.instances.list(machine_group)
|
111
|
+
raise "No machines running in #{machine_group}" unless @list
|
112
|
+
true
|
113
|
+
end
|
114
|
+
def status
|
115
|
+
puts "There are no machines running in #{machine_group}" if @list.empty?
|
116
|
+
@list.each_pair do |id, inst|
|
117
|
+
print_instance inst
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
#def update_valid?
|
123
|
+
# raise "No EC2 .pem keys provided" unless has_pem_keys?
|
124
|
+
# raise "No SSH key provided for #{@global.user}!" unless has_keypair?
|
125
|
+
# raise "No SSH key provided for root!" unless has_keypair?(:root)
|
126
|
+
#
|
127
|
+
# @script = File.join(RUDY_HOME, 'support', 'rudy-ec2-startup')
|
128
|
+
#
|
129
|
+
# raise "Cannot find startup script" unless File.exists?(@script)
|
130
|
+
#
|
131
|
+
#
|
132
|
+
# true
|
133
|
+
#end
|
134
|
+
#
|
135
|
+
#
|
136
|
+
#def update
|
137
|
+
# puts "Updating Rudy "
|
138
|
+
# switch_user("root")
|
139
|
+
#
|
140
|
+
# exit unless are_you_sure?
|
141
|
+
# scp do |scp|
|
142
|
+
# puts "Updating Rudy startup script (#{@script})"
|
143
|
+
# scp.upload!(@script, "/etc/init.d/") do |ch, name, sent, total|
|
144
|
+
# puts "#{name}: #{sent}/#{total}"
|
145
|
+
# end
|
146
|
+
# end
|
147
|
+
#
|
148
|
+
# ssh do |session|
|
149
|
+
# session.exec!("chmod 700 /etc/init.d/rudy-ec2-startup")
|
150
|
+
# puts "Installing Rudy (#{Rudy::VERSION})"
|
151
|
+
# puts session.exec!("gem sources -a http://gems.github.com")
|
152
|
+
# puts session.exec!("gem install --no-ri --no-rdoc solutious-rudy -v #{Rudy::VERSION}")
|
153
|
+
# end
|
154
|
+
#end
|
155
|
+
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
|