ec2-instance-manager 0.3.0 → 0.3.1
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/README.rdoc +11 -2
- data/VERSION +1 -1
- data/ec2-instance-manager.gemspec +5 -2
- data/lib/ec2-instance-manager/ec2_instance_manager.rb +7 -2
- data/lib/ec2-instance-manager/launch.rb +33 -17
- data/lib/ec2-instance-manager/output.rb +10 -1
- data/lib/ec2-instance-manager/status.rb +8 -8
- metadata +12 -2
data/README.rdoc
CHANGED
@@ -2,13 +2,22 @@
|
|
2
2
|
|
3
3
|
Simple EC2 Instance Manager that is able to work with multiple AWS accounts (in config.yml). See config.yml.sample.
|
4
4
|
|
5
|
-
Create a "config.yml" in the current directory and run "ec2_instance_manager". You can launch & terminate instances, assign public IP's and
|
6
|
-
attach volumes.
|
5
|
+
Create a "config.yml" in the current directory and run "ec2_instance_manager". You can launch & terminate instances, create whole launch plans, start all launch plan groups or start an individual launch plan group, assign public IP's and attach volumes.
|
7
6
|
|
8
7
|
Run ec2-instance-manager --help for options and commands.
|
9
8
|
|
10
9
|
This gem should be considered ALPHA! More features to come...
|
11
10
|
|
11
|
+
== Installation
|
12
|
+
|
13
|
+
sudo gem install amazon-ec2
|
14
|
+
|
15
|
+
sudo gem install ec2-instance-manager (Gemcutter)
|
16
|
+
|
17
|
+
or
|
18
|
+
|
19
|
+
sudo gem install okiess-ec2-instance-manager (Github)
|
20
|
+
|
12
21
|
== Note on Patches/Pull Requests
|
13
22
|
|
14
23
|
* Fork the project.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.1
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ec2-instance-manager}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Oliver Kiessler"]
|
12
|
-
s.date = %q{2009-10-
|
12
|
+
s.date = %q{2009-10-17}
|
13
13
|
s.default_executable = %q{ec2-instance-manager}
|
14
14
|
s.description = %q{Launches EC2 instances for multiple AWS accounts}
|
15
15
|
s.email = %q{kiessler@inceedo.com}
|
@@ -51,11 +51,14 @@ Gem::Specification.new do |s|
|
|
51
51
|
s.specification_version = 3
|
52
52
|
|
53
53
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
54
|
+
s.add_runtime_dependency(%q<amazon-ec2>, [">= 0"])
|
54
55
|
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
55
56
|
else
|
57
|
+
s.add_dependency(%q<amazon-ec2>, [">= 0"])
|
56
58
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
57
59
|
end
|
58
60
|
else
|
61
|
+
s.add_dependency(%q<amazon-ec2>, [">= 0"])
|
59
62
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
60
63
|
end
|
61
64
|
end
|
@@ -4,7 +4,7 @@ require File.dirname(__FILE__) + '/output'
|
|
4
4
|
|
5
5
|
class Ec2InstanceManager
|
6
6
|
include Status, Launch, Output
|
7
|
-
VERSION = '0.3'
|
7
|
+
VERSION = '0.3.1'
|
8
8
|
|
9
9
|
attr_reader :config, :customer_key, :options
|
10
10
|
|
@@ -30,6 +30,11 @@ class Ec2InstanceManager
|
|
30
30
|
opts.on( '-l', '--start-launch-plan', 'Starts a launch plan under a config key' ) do
|
31
31
|
options[:start_launch_plan] = true
|
32
32
|
end
|
33
|
+
|
34
|
+
options[:group] = nil
|
35
|
+
opts.on( '-g', '--group LAUNCH_GROUP_NAME', 'Starts a launch plan group under a config key' ) do |group|
|
36
|
+
options[:group] = group
|
37
|
+
end
|
33
38
|
|
34
39
|
options[:config] = nil
|
35
40
|
opts.on( '-c', '--config CONFIG_KEY', 'Sets the config key' ) do |key|
|
@@ -67,7 +72,7 @@ class Ec2InstanceManager
|
|
67
72
|
end
|
68
73
|
|
69
74
|
def run
|
70
|
-
puts "EC2 Instance Manager #{VERSION}"
|
75
|
+
puts white("EC2 Instance Manager #{VERSION}")
|
71
76
|
puts
|
72
77
|
unless options[:config]
|
73
78
|
puts "Which customer config do you want to use? (#{config.keys.join(", ")})"
|
@@ -14,8 +14,8 @@ module Launch
|
|
14
14
|
instance_state = nil
|
15
15
|
while(instance_state != 'running')
|
16
16
|
instance_state, dns_name = get_instance_state(instance_id)
|
17
|
-
puts "=> Checking for running state... #{instance_state}"
|
18
|
-
puts "=> Public DNS: #{dns_name}" if instance_state == 'running'
|
17
|
+
puts "=> Checking for running state... #{output_running_state(instance_state)}"
|
18
|
+
puts "=> Public DNS: #{white(dns_name)}" if instance_state == 'running'
|
19
19
|
sleep 10 unless instance_state == 'running'
|
20
20
|
end
|
21
21
|
|
@@ -49,15 +49,14 @@ module Launch
|
|
49
49
|
instances = get_running_instances_list
|
50
50
|
if instances and instances.any?
|
51
51
|
puts
|
52
|
-
|
53
|
-
puts red("Please cancel within the next 5 seconds...")
|
52
|
+
cancel_message(instances)
|
54
53
|
sleep 5
|
55
54
|
ec2.terminate_instances(:instance_id => instances)
|
56
55
|
puts
|
57
|
-
puts "All instances are going to terminate now."
|
56
|
+
puts white("All instances are going to terminate now.")
|
58
57
|
else
|
59
58
|
puts
|
60
|
-
puts "No running instances."
|
59
|
+
puts white("No running instances.")
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
@@ -66,22 +65,39 @@ module Launch
|
|
66
65
|
puts
|
67
66
|
puts "Your Launch Plan:"
|
68
67
|
if config[@customer_key]["launch_plan"] and config[@customer_key]["launch_plan"].any?
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
68
|
+
|
69
|
+
launch_plan_groups = config[@customer_key]["launch_plan"].keys.sort
|
70
|
+
|
71
|
+
if self.options[:group]
|
72
|
+
puts
|
73
|
+
puts "Existing groups: #{launch_plan_groups.join(", ")}"
|
74
|
+
if launch_plan_groups.include?(self.options[:group])
|
75
|
+
puts "Targeted Group: #{self.options[:group]}"
|
76
|
+
config[@customer_key]["launch_plan"][self.options[:group]].each do |ami_id|
|
77
|
+
puts "#{ami_id[0]} => #{ami_id[1]} Instances to launch"
|
78
|
+
ami_ids_to_launch << [ami_id[0], ami_id[1]]
|
76
79
|
end
|
77
80
|
else
|
78
|
-
puts "
|
81
|
+
puts white("Targeted Launch plan group '#{self.options[:group]}' not found.")
|
82
|
+
end
|
83
|
+
else
|
84
|
+
launch_plan_groups.each do |launch_plan_group|
|
85
|
+
puts
|
86
|
+
puts "Group: #{launch_plan_group}"
|
87
|
+
if config[@customer_key]["launch_plan"][launch_plan_group] and config[@customer_key]["launch_plan"][launch_plan_group].any?
|
88
|
+
config[@customer_key]["launch_plan"][launch_plan_group].keys.each do |ami_id|
|
89
|
+
puts "#{ami_id} => #{config[@customer_key]["launch_plan"][launch_plan_group][ami_id]} Instances to launch"
|
90
|
+
ami_ids_to_launch << [ami_id, config[@customer_key]["launch_plan"][launch_plan_group][ami_id]]
|
91
|
+
end
|
92
|
+
else
|
93
|
+
puts white("No Ami Id's to launch defined.")
|
94
|
+
end
|
79
95
|
end
|
80
96
|
end
|
81
97
|
|
82
98
|
puts
|
83
99
|
puts red("Warning: Now launching your plan...")
|
84
|
-
puts red("Please cancel within the next 5 seconds...")
|
100
|
+
puts red("Please cancel within the next 5 seconds if this isn't want you want...")
|
85
101
|
puts
|
86
102
|
sleep 5
|
87
103
|
|
@@ -92,9 +108,9 @@ module Launch
|
|
92
108
|
}
|
93
109
|
end
|
94
110
|
|
95
|
-
puts "All instances are launching now..."
|
111
|
+
puts white("All instances are launching now...")
|
96
112
|
else
|
97
|
-
puts "No launch groups defined."
|
113
|
+
puts white("No launch plan groups defined.")
|
98
114
|
end
|
99
115
|
end
|
100
116
|
|
@@ -2,7 +2,7 @@ module Output
|
|
2
2
|
def output_running_state(running_state)
|
3
3
|
if running_state == 'running'
|
4
4
|
green(running_state)
|
5
|
-
elsif running_state == 'terminated'
|
5
|
+
elsif running_state == 'terminated' or running_state == 'shutting-down'
|
6
6
|
red(running_state)
|
7
7
|
elsif running_state == 'pending'
|
8
8
|
yellow(running_state)
|
@@ -11,6 +11,11 @@ module Output
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def cancel_message(instances)
|
15
|
+
puts red("Warning: Terminating all instances: #{instances.join(", ")}")
|
16
|
+
puts red("Please cancel within the next 5 seconds if this isn't want you want...")
|
17
|
+
end
|
18
|
+
|
14
19
|
def green(str)
|
15
20
|
"\033[32m#{str}\033[0m"
|
16
21
|
end
|
@@ -22,4 +27,8 @@ module Output
|
|
22
27
|
def yellow(str)
|
23
28
|
"\033[33m#{str}\033[0m"
|
24
29
|
end
|
30
|
+
|
31
|
+
def white(str)
|
32
|
+
"\033[1m#{str}\033[0m"
|
33
|
+
end
|
25
34
|
end
|
@@ -9,9 +9,9 @@ module Status
|
|
9
9
|
def display_ami_ids(owner_id = nil)
|
10
10
|
result = ec2.describe_images(:owner_id => owner_id || config[@customer_key]['amazon_account_number'])
|
11
11
|
if result and result["imagesSet"]
|
12
|
-
result["imagesSet"]["item"].each {|image| puts "#{image["imageId"]} - #{image["imageLocation"]}"}
|
12
|
+
result["imagesSet"]["item"].each {|image| puts "#{white(image["imageId"])} - #{image["imageLocation"]}"}
|
13
13
|
else
|
14
|
-
puts "No images."
|
14
|
+
puts white("No images.")
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -23,10 +23,10 @@ module Status
|
|
23
23
|
ami_id = item["instancesSet"]["item"].first["imageId"]
|
24
24
|
running_state = item["instancesSet"]["item"].first["instanceState"]["name"]
|
25
25
|
dns_name = item["instancesSet"]["item"].first["dnsName"]
|
26
|
-
puts "Instance Id: #{instance_id} - #{output_running_state(running_state)} (AMI Id: #{ami_id}) #{dns_name}"
|
26
|
+
puts "Instance Id: #{white(instance_id)} - #{output_running_state(running_state)} (AMI Id: #{white(ami_id)}) #{dns_name}"
|
27
27
|
end
|
28
28
|
else
|
29
|
-
puts "No instances."
|
29
|
+
puts white("No instances.")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -34,10 +34,10 @@ module Status
|
|
34
34
|
result = ec2.describe_addresses
|
35
35
|
if result and result["addressesSet"]
|
36
36
|
result["addressesSet"]["item"].each do |ip|
|
37
|
-
puts "#{ip["publicIp"]} => #{ip["instanceId"].nil? ? 'unassigned' : ip["instanceId"]}"
|
37
|
+
puts "#{white(ip["publicIp"])} => #{ip["instanceId"].nil? ? 'unassigned' : ip["instanceId"]}"
|
38
38
|
end
|
39
39
|
else
|
40
|
-
puts "No addresses."
|
40
|
+
puts white("No addresses.")
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -49,10 +49,10 @@ module Status
|
|
49
49
|
if vol["attachmentSet"]
|
50
50
|
instance_id = vol["attachmentSet"]["item"].first["instanceId"]
|
51
51
|
end
|
52
|
-
puts "#{vol["volumeId"]} (Size: #{vol["size"]} / Zone: #{vol["availabilityZone"]}) - #{vol["status"]} => #{instance_id.nil? ? 'unassigned' : instance_id}"
|
52
|
+
puts "#{white(vol["volumeId"])} (Size: #{vol["size"]} / Zone: #{vol["availabilityZone"]}) - #{vol["status"]} => #{instance_id.nil? ? 'unassigned' : instance_id}"
|
53
53
|
end
|
54
54
|
else
|
55
|
-
puts "No volumes."
|
55
|
+
puts white("No volumes.")
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ec2-instance-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oliver Kiessler
|
@@ -9,9 +9,19 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-17 00:00:00 +02:00
|
13
13
|
default_executable: ec2-instance-manager
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: amazon-ec2
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
15
25
|
- !ruby/object:Gem::Dependency
|
16
26
|
name: thoughtbot-shoulda
|
17
27
|
type: :development
|