ec2-instance-manager 0.2.1 → 0.3.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/Rakefile +1 -0
- data/VERSION +1 -1
- data/config.yml.sample +8 -1
- data/ec2-instance-manager.gemspec +3 -2
- data/lib/ec2-instance-manager/ec2_instance_manager.rb +16 -7
- data/lib/ec2-instance-manager/launch.rb +54 -9
- data/lib/ec2-instance-manager/output.rb +25 -0
- data/lib/ec2-instance-manager/status.rb +2 -2
- metadata +3 -2
data/Rakefile
CHANGED
|
@@ -10,6 +10,7 @@ begin
|
|
|
10
10
|
gem.email = "kiessler@inceedo.com"
|
|
11
11
|
gem.homepage = "http://github.com/okiess/ec2-instance-manager"
|
|
12
12
|
gem.authors = ["Oliver Kiessler"]
|
|
13
|
+
gem.add_dependency "amazon-ec2"
|
|
13
14
|
gem.add_development_dependency "thoughtbot-shoulda"
|
|
14
15
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
|
15
16
|
end
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.0
|
data/config.yml.sample
CHANGED
|
@@ -5,6 +5,11 @@ default:
|
|
|
5
5
|
key:
|
|
6
6
|
availability_zone: eu-west-1a
|
|
7
7
|
instance_type: m1.small
|
|
8
|
+
launch_plan:
|
|
9
|
+
group1:
|
|
10
|
+
"ami_id_xxx1": 1
|
|
11
|
+
group2:
|
|
12
|
+
"ami_id_xxx2": 1
|
|
8
13
|
|
|
9
14
|
customer1:
|
|
10
15
|
amazon_access_key_id:
|
|
@@ -21,4 +26,6 @@ customer2:
|
|
|
21
26
|
key:
|
|
22
27
|
availability_zone: eu-west-1a
|
|
23
28
|
instance_type: m1.small
|
|
24
|
-
|
|
29
|
+
launch_plan:
|
|
30
|
+
group1:
|
|
31
|
+
ami_id_xxx1: 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.
|
|
8
|
+
s.version = "0.3.0"
|
|
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-16}
|
|
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}
|
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
|
31
31
|
"lib/ec2-instance-manager.rb",
|
|
32
32
|
"lib/ec2-instance-manager/ec2_instance_manager.rb",
|
|
33
33
|
"lib/ec2-instance-manager/launch.rb",
|
|
34
|
+
"lib/ec2-instance-manager/output.rb",
|
|
34
35
|
"lib/ec2-instance-manager/status.rb",
|
|
35
36
|
"test/ec2-instance-manager_test.rb",
|
|
36
37
|
"test/test_helper.rb"
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require File.dirname(__FILE__) + '/status'
|
|
2
2
|
require File.dirname(__FILE__) + '/launch'
|
|
3
|
+
require File.dirname(__FILE__) + '/output'
|
|
3
4
|
|
|
4
5
|
class Ec2InstanceManager
|
|
5
|
-
include Status
|
|
6
|
-
|
|
7
|
-
VERSION = '0.2'
|
|
6
|
+
include Status, Launch, Output
|
|
7
|
+
VERSION = '0.3'
|
|
8
8
|
|
|
9
9
|
attr_reader :config, :customer_key, :options
|
|
10
10
|
|
|
@@ -14,7 +14,7 @@ class Ec2InstanceManager
|
|
|
14
14
|
options = {}
|
|
15
15
|
|
|
16
16
|
optparse = OptionParser.new do |opts|
|
|
17
|
-
opts.banner = "Usage: ec2-instance-manager [options]"
|
|
17
|
+
opts.banner = "Usage: ec2-instance-manager #{VERSION} [options]"
|
|
18
18
|
|
|
19
19
|
options[:status] = false
|
|
20
20
|
opts.on( '-s', '--status', 'Status only' ) do
|
|
@@ -25,7 +25,12 @@ class Ec2InstanceManager
|
|
|
25
25
|
opts.on( '-t', '--terminate-all', 'Terminates all instances running under a config key' ) do
|
|
26
26
|
options[:terminate] = true
|
|
27
27
|
end
|
|
28
|
-
|
|
28
|
+
|
|
29
|
+
options[:start_launch_plan] = false
|
|
30
|
+
opts.on( '-l', '--start-launch-plan', 'Starts a launch plan under a config key' ) do
|
|
31
|
+
options[:start_launch_plan] = true
|
|
32
|
+
end
|
|
33
|
+
|
|
29
34
|
options[:config] = nil
|
|
30
35
|
opts.on( '-c', '--config CONFIG_KEY', 'Sets the config key' ) do |key|
|
|
31
36
|
options[:config] = key
|
|
@@ -44,9 +49,11 @@ class Ec2InstanceManager
|
|
|
44
49
|
def config; @config ||= read_config; end
|
|
45
50
|
def read_config
|
|
46
51
|
if File.exists?("config.yml")
|
|
52
|
+
puts "Using config in this directory"
|
|
47
53
|
@config = YAML.load(File.read("config.yml"))
|
|
48
54
|
else
|
|
49
55
|
begin
|
|
56
|
+
puts "Using config in your home directory"
|
|
50
57
|
@config = YAML.load(File.read("#{ENV['HOME']}/.ec2_instance_manager_config.yml"))
|
|
51
58
|
rescue Errno::ENOENT
|
|
52
59
|
raise "config.yml expected in current directory or ~/.ec2_instance_manager_config.yml"
|
|
@@ -60,7 +67,7 @@ class Ec2InstanceManager
|
|
|
60
67
|
end
|
|
61
68
|
|
|
62
69
|
def run
|
|
63
|
-
puts "EC2 Instance Manager"
|
|
70
|
+
puts "EC2 Instance Manager #{VERSION}"
|
|
64
71
|
puts
|
|
65
72
|
unless options[:config]
|
|
66
73
|
puts "Which customer config do you want to use? (#{config.keys.join(", ")})"
|
|
@@ -71,7 +78,7 @@ class Ec2InstanceManager
|
|
|
71
78
|
@customer_key = options[:config]
|
|
72
79
|
end
|
|
73
80
|
|
|
74
|
-
puts "Configuration: #{@customer_key}"
|
|
81
|
+
puts "Configuration Key: #{@customer_key}"
|
|
75
82
|
puts "AMAZON_ACCESS_KEY_ID: #{config[@customer_key]['amazon_access_key_id']}"
|
|
76
83
|
puts "KEY: #{config[@customer_key]['key']}"
|
|
77
84
|
puts "ZONE: #{config[@customer_key]['availability_zone']}"
|
|
@@ -81,6 +88,8 @@ class Ec2InstanceManager
|
|
|
81
88
|
|
|
82
89
|
if options[:terminate]
|
|
83
90
|
terminate
|
|
91
|
+
elsif options[:start_launch_plan]
|
|
92
|
+
start_launch_plan
|
|
84
93
|
else
|
|
85
94
|
launch unless options[:status]
|
|
86
95
|
end
|
|
@@ -5,12 +5,7 @@ module Launch
|
|
|
5
5
|
ami_id = gets
|
|
6
6
|
ami_id = ami_id.lstrip.rstrip
|
|
7
7
|
|
|
8
|
-
result =
|
|
9
|
-
:image_id => ami_id,
|
|
10
|
-
:instance_type => config[@customer_key]['instance_type'],
|
|
11
|
-
:key_name => config[@customer_key]['key'],
|
|
12
|
-
:availability_zone => config[@customer_key]['availability_zone']
|
|
13
|
-
)
|
|
8
|
+
result = launch_ami(ami_id)
|
|
14
9
|
|
|
15
10
|
instance_id = result.instancesSet.item[0].instanceId
|
|
16
11
|
puts "=> Starting Instance Id: #{instance_id}"
|
|
@@ -54,21 +49,71 @@ module Launch
|
|
|
54
49
|
instances = get_running_instances_list
|
|
55
50
|
if instances and instances.any?
|
|
56
51
|
puts
|
|
57
|
-
puts "Warning: Terminating all instances: #{instances.join(", ")}"
|
|
58
|
-
puts "Please cancel within the next 5 seconds..."
|
|
52
|
+
puts red("Warning: Terminating all instances: #{instances.join(", ")}")
|
|
53
|
+
puts red("Please cancel within the next 5 seconds...")
|
|
59
54
|
sleep 5
|
|
60
55
|
ec2.terminate_instances(:instance_id => instances)
|
|
61
56
|
puts
|
|
62
57
|
puts "All instances are going to terminate now."
|
|
58
|
+
else
|
|
59
|
+
puts
|
|
60
|
+
puts "No running instances."
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def start_launch_plan
|
|
65
|
+
ami_ids_to_launch = []
|
|
66
|
+
puts
|
|
67
|
+
puts "Your Launch Plan:"
|
|
68
|
+
if config[@customer_key]["launch_plan"] and config[@customer_key]["launch_plan"].any?
|
|
69
|
+
config[@customer_key]["launch_plan"].keys.sort.each do |launch_plan_group|
|
|
70
|
+
puts
|
|
71
|
+
puts "Group: #{launch_plan_group}"
|
|
72
|
+
if config[@customer_key]["launch_plan"][launch_plan_group] and config[@customer_key]["launch_plan"][launch_plan_group].any?
|
|
73
|
+
config[@customer_key]["launch_plan"][launch_plan_group].keys.each do |ami_id|
|
|
74
|
+
puts "#{ami_id} => #{config[@customer_key]["launch_plan"][launch_plan_group][ami_id]} Instances to launch"
|
|
75
|
+
ami_ids_to_launch << [ami_id, config[@customer_key]["launch_plan"][launch_plan_group][ami_id]]
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
puts "No Ami Id's to launch defined."
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
puts
|
|
83
|
+
puts red("Warning: Now launching your plan...")
|
|
84
|
+
puts red("Please cancel within the next 5 seconds...")
|
|
85
|
+
puts
|
|
86
|
+
sleep 5
|
|
87
|
+
|
|
88
|
+
ami_ids_to_launch.each do |group_ami_id_pair|
|
|
89
|
+
group_ami_id_pair[1].times {
|
|
90
|
+
puts "Launching #{group_ami_id_pair[0]}..."
|
|
91
|
+
result = launch_ami(group_ami_id_pair[0])
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
puts "All instances are launching now..."
|
|
96
|
+
else
|
|
97
|
+
puts "No launch groups defined."
|
|
63
98
|
end
|
|
64
99
|
end
|
|
100
|
+
|
|
101
|
+
def launch_ami(ami_id)
|
|
102
|
+
ec2.run_instances(
|
|
103
|
+
:image_id => ami_id,
|
|
104
|
+
:instance_type => config[@customer_key]['instance_type'],
|
|
105
|
+
:key_name => config[@customer_key]['key'],
|
|
106
|
+
:availability_zone => config[@customer_key]['availability_zone']
|
|
107
|
+
)
|
|
108
|
+
end
|
|
65
109
|
|
|
110
|
+
private
|
|
66
111
|
def get_running_instances_list
|
|
67
112
|
result = ec2.describe_instances
|
|
68
113
|
if result and result["reservationSet"]
|
|
69
114
|
result["reservationSet"]["item"].collect do |item|
|
|
70
115
|
item["instancesSet"]["item"].first["instanceId"] if item["instancesSet"]["item"].first["instanceState"]["name"] == 'running'
|
|
71
|
-
end
|
|
116
|
+
end.compact
|
|
72
117
|
end
|
|
73
118
|
end
|
|
74
119
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Output
|
|
2
|
+
def output_running_state(running_state)
|
|
3
|
+
if running_state == 'running'
|
|
4
|
+
green(running_state)
|
|
5
|
+
elsif running_state == 'terminated'
|
|
6
|
+
red(running_state)
|
|
7
|
+
elsif running_state == 'pending'
|
|
8
|
+
yellow(running_state)
|
|
9
|
+
else
|
|
10
|
+
running_state
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def green(str)
|
|
15
|
+
"\033[32m#{str}\033[0m"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def red(str)
|
|
19
|
+
"\033[31m#{str}\033[0m"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def yellow(str)
|
|
23
|
+
"\033[33m#{str}\033[0m"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -23,13 +23,13 @@ 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} - #{running_state} (AMI Id: #{ami_id}) #{dns_name}"
|
|
26
|
+
puts "Instance Id: #{instance_id} - #{output_running_state(running_state)} (AMI Id: #{ami_id}) #{dns_name}"
|
|
27
27
|
end
|
|
28
28
|
else
|
|
29
29
|
puts "No instances."
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
def display_addresses
|
|
34
34
|
result = ec2.describe_addresses
|
|
35
35
|
if result and result["addressesSet"]
|
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.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Oliver Kiessler
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-10-
|
|
12
|
+
date: 2009-10-16 00:00:00 +02:00
|
|
13
13
|
default_executable: ec2-instance-manager
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -44,6 +44,7 @@ files:
|
|
|
44
44
|
- lib/ec2-instance-manager.rb
|
|
45
45
|
- lib/ec2-instance-manager/ec2_instance_manager.rb
|
|
46
46
|
- lib/ec2-instance-manager/launch.rb
|
|
47
|
+
- lib/ec2-instance-manager/output.rb
|
|
47
48
|
- lib/ec2-instance-manager/status.rb
|
|
48
49
|
- test/ec2-instance-manager_test.rb
|
|
49
50
|
- test/test_helper.rb
|