ec2launcher 1.0.22 → 1.0.23
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/ec2launcher.gemspec +1 -0
- data/lib/ec2launcher/init_options.rb +11 -1
- data/lib/ec2launcher/version.rb +1 -1
- data/lib/ec2launcher.rb +63 -46
- data/startup-scripts/setup_instance.rb +4 -2
- metadata +19 -2
data/CHANGELOG.md
CHANGED
data/ec2launcher.gemspec
CHANGED
@@ -98,7 +98,7 @@ module EC2Launcher
|
|
98
98
|
@options.instance_type = instance_type
|
99
99
|
end
|
100
100
|
|
101
|
-
opts.on("
|
101
|
+
opts.on("--volume-size SIZE", Integer, "EBS volume size in GB. Defaults to #{EC2Launcher::DEFAULT_VOLUME_SIZE} GB") do |volume_size|
|
102
102
|
@options.volume_size = volume_size
|
103
103
|
end
|
104
104
|
|
@@ -116,6 +116,14 @@ module EC2Launcher
|
|
116
116
|
opts.separator ""
|
117
117
|
opts.separator "Common options:"
|
118
118
|
|
119
|
+
opts.on_tail("-q", "--quiet", "Display as little information as possible.") do
|
120
|
+
@options.verbosity = :quiet
|
121
|
+
end
|
122
|
+
|
123
|
+
opts.on_tail("-v", "--verbose", "Display as much information as possible.") do
|
124
|
+
@options.verbosity = :verbose
|
125
|
+
end
|
126
|
+
|
119
127
|
# No argument, shows at tail. This will print an options summary.
|
120
128
|
# Try it and see!
|
121
129
|
opts.on_tail("-?", "--help", "Show this message") do
|
@@ -152,6 +160,8 @@ module EC2Launcher
|
|
152
160
|
@options.instance_type = nil
|
153
161
|
@options.volume_size = nil
|
154
162
|
|
163
|
+
@options.verbosity = :normal
|
164
|
+
|
155
165
|
@options.directory = "./"
|
156
166
|
|
157
167
|
if @command == "init"
|
data/lib/ec2launcher/version.rb
CHANGED
data/lib/ec2launcher.rb
CHANGED
@@ -5,6 +5,7 @@ require 'rubygems'
|
|
5
5
|
require 'optparse'
|
6
6
|
require 'ostruct'
|
7
7
|
require 'aws-sdk'
|
8
|
+
require 'log4r'
|
8
9
|
|
9
10
|
require 'ec2launcher/version'
|
10
11
|
require 'ec2launcher/defaults'
|
@@ -18,6 +19,8 @@ require 'ec2launcher/instance_paths_config'
|
|
18
19
|
require 'ec2launcher/block_device_builder'
|
19
20
|
require 'ec2launcher/hostname_generator'
|
20
21
|
|
22
|
+
include Log4r
|
23
|
+
|
21
24
|
module EC2Launcher
|
22
25
|
|
23
26
|
class AmiDetails
|
@@ -35,10 +38,21 @@ module EC2Launcher
|
|
35
38
|
def initialize()
|
36
39
|
@run_url_script_cache = nil
|
37
40
|
@setup_script_cache = nil
|
41
|
+
|
42
|
+
@log = Logger.new 'mylog'
|
43
|
+
log_output = Outputter.stdout
|
44
|
+
log_output.formatter = PatternFormatter.new :pattern => "%m"
|
45
|
+
@log.outputters = log_output
|
38
46
|
end
|
39
47
|
|
40
48
|
def launch(options)
|
41
49
|
@options = options
|
50
|
+
|
51
|
+
@log.level = case @options.verbosity
|
52
|
+
when :quiet then WARN
|
53
|
+
when :verbose then DEBUG
|
54
|
+
else INFO
|
55
|
+
end
|
42
56
|
|
43
57
|
# Load configuration data
|
44
58
|
@config = load_config_file
|
@@ -104,7 +118,7 @@ module EC2Launcher
|
|
104
118
|
# ENVIRONMENT
|
105
119
|
##############################
|
106
120
|
unless @environments.has_key? options.environ
|
107
|
-
|
121
|
+
@log.fatal "Environment not found: #{options.environ}"
|
108
122
|
exit 2
|
109
123
|
end
|
110
124
|
@environment = @environments[options.environ]
|
@@ -113,7 +127,7 @@ module EC2Launcher
|
|
113
127
|
# APPLICATION
|
114
128
|
##############################
|
115
129
|
unless @applications.has_key? options.application
|
116
|
-
|
130
|
+
@log.fatal "Application not found: #{options.application}"
|
117
131
|
exit 3
|
118
132
|
end
|
119
133
|
@application = @applications[options.application]
|
@@ -157,7 +171,7 @@ module EC2Launcher
|
|
157
171
|
##############################
|
158
172
|
key_name = @environment.key_name
|
159
173
|
if key_name.nil?
|
160
|
-
|
174
|
+
@log.fatal "Unable to determine SSH key name."
|
161
175
|
exit 4
|
162
176
|
end
|
163
177
|
|
@@ -190,7 +204,7 @@ module EC2Launcher
|
|
190
204
|
end
|
191
205
|
|
192
206
|
if missing_security_groups.length > 0
|
193
|
-
|
207
|
+
@log.fatal "ERROR: Missing security groups: #{missing_security_groups.join(', ')}"
|
194
208
|
exit 3
|
195
209
|
end
|
196
210
|
|
@@ -301,34 +315,37 @@ module EC2Launcher
|
|
301
315
|
aws_keyfile = @environment.aws_keyfile
|
302
316
|
|
303
317
|
##############################
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
318
|
+
@log.info
|
319
|
+
@log.info "Availability zone: #{availability_zone}"
|
320
|
+
@log.info "Key name : #{key_name}"
|
321
|
+
@log.info "Security groups : " + security_groups.collect {|name| "#{name} (#{sg_map[name].security_group_id})"}.join(", ")
|
322
|
+
@log.info "Instance type : #{instance_type}"
|
323
|
+
@log.info "Architecture : #{instance_architecture}"
|
324
|
+
@log.info "AMI name : #{ami.ami_name}"
|
325
|
+
@log.info "AMI id : #{ami.ami_id}"
|
326
|
+
@log.info "ELB : #{elb_name}" if elb_name
|
327
|
+
@log.info "Chef PEM : #{chef_validation_pem_url}"
|
328
|
+
@log.info "AWS key file : #{aws_keyfile}"
|
329
|
+
@log.info "Roles : #{roles.join(', ')}"
|
330
|
+
@log.info "Gems : #{gems.join(', ')}"
|
331
|
+
@log.info "Packages : #{packages.join(', ')}"
|
332
|
+
if subnet
|
333
|
+
cidr_block = ec2.subnets[subnet].cidr_block
|
334
|
+
@log.info "VPC Subnet : #{subnet} (#{cidr_block})"
|
335
|
+
end
|
336
|
+
@log.info ""
|
320
337
|
fqdn_names.each do |fqdn|
|
321
|
-
|
338
|
+
@log.info "Name : #{fqdn}"
|
322
339
|
end
|
323
340
|
|
324
341
|
unless block_device_mappings.empty?
|
325
|
-
|
326
|
-
|
342
|
+
@log.info ""
|
343
|
+
@log.info "Block devices :"
|
327
344
|
block_device_mappings.keys.sort.each do |key|
|
328
345
|
if block_device_mappings[key] =~ /^ephemeral/
|
329
|
-
|
346
|
+
@log.info " Block device : #{key}, #{block_device_mappings[key]}"
|
330
347
|
else
|
331
|
-
|
348
|
+
@log.info " Block device : #{key}, #{block_device_mappings[key][:volume_size]}GB, " +
|
332
349
|
"#{block_device_mappings[key][:snapshot_id]}, " +
|
333
350
|
"(#{block_device_mappings[key][:delete_on_termination] ? 'auto-delete' : 'no delete'})"
|
334
351
|
end
|
@@ -336,7 +353,7 @@ module EC2Launcher
|
|
336
353
|
end
|
337
354
|
|
338
355
|
if chef_validation_pem_url.nil?
|
339
|
-
|
356
|
+
@log.fatal "***ERROR*** Missing the URL For the Chef Validation PEM file."
|
340
357
|
exit 3
|
341
358
|
end
|
342
359
|
|
@@ -344,10 +361,10 @@ module EC2Launcher
|
|
344
361
|
if @options.show_defaults || @options.show_user_data
|
345
362
|
if @options.show_user_data
|
346
363
|
user_data = build_launch_command(fqdn_names[0], short_hostnames[0], roles, chef_validation_pem_url, aws_keyfile, gems, packages, email_notifications)
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
364
|
+
@log.info ""
|
365
|
+
@log.info "---user-data---"
|
366
|
+
@log.info user_data
|
367
|
+
@log.info "---user-data---"
|
351
368
|
end
|
352
369
|
exit 0
|
353
370
|
end
|
@@ -355,7 +372,7 @@ module EC2Launcher
|
|
355
372
|
##############################
|
356
373
|
# Launch the new intance
|
357
374
|
##############################
|
358
|
-
|
375
|
+
@log.warn ""
|
359
376
|
instances = []
|
360
377
|
fqdn_names.each_index do |i|
|
361
378
|
block_device_tags = block_device_builder.generate_device_tags(fqdn_names[i], short_hostnames[i], @environment.name, @application.block_devices)
|
@@ -366,14 +383,14 @@ module EC2Launcher
|
|
366
383
|
|
367
384
|
public_dns_name = instance.public_dns_name.nil? ? "no public dns" : instance.public_dns_name
|
368
385
|
private_dns_name = instance.private_dns_name.nil? ? "no private dns" : instance.private_dns_name
|
369
|
-
|
386
|
+
@log.warn "Launched #{fqdn_names[i]} (#{instance.id}) [#{public_dns_name} / #{private_dns_name} / #{instance.private_ip_address} ]"
|
370
387
|
end
|
371
388
|
|
372
|
-
|
389
|
+
@log.warn "********************"
|
373
390
|
fqdn_names.each_index do |i|
|
374
391
|
public_dns_name = instances[i].public_dns_name.nil? ? "n/a" : instances[i].public_dns_name
|
375
392
|
private_dns_name = instances[i].private_dns_name.nil? ? "n/a" : instances[i].private_dns_name
|
376
|
-
|
393
|
+
@log.warn "** New instance: #{fqdn_names[i]} | #{instances[i].id} | #{public_dns_name} | #{private_dns_name} | #{instances[i].private_ip_address}"
|
377
394
|
end
|
378
395
|
|
379
396
|
##############################
|
@@ -386,7 +403,7 @@ module EC2Launcher
|
|
386
403
|
##############################
|
387
404
|
# COMPLETED
|
388
405
|
##############################
|
389
|
-
|
406
|
+
@log.warn "********************"
|
390
407
|
end
|
391
408
|
|
392
409
|
# Attaches an instance to the specified ELB.
|
@@ -396,8 +413,8 @@ module EC2Launcher
|
|
396
413
|
#
|
397
414
|
def attach_to_elb(instance, elb_name)
|
398
415
|
begin
|
399
|
-
|
400
|
-
|
416
|
+
@log.info ""
|
417
|
+
@log.info "Adding to ELB: #{elb_name}"
|
401
418
|
elb = AWS::ELB.new
|
402
419
|
AWS.memoize do
|
403
420
|
# Build list of availability zones for any existing instances
|
@@ -426,7 +443,7 @@ module EC2Launcher
|
|
426
443
|
elb.load_balancers[elb_name].instances.register(instance)
|
427
444
|
end
|
428
445
|
rescue StandardError => bang
|
429
|
-
|
446
|
+
@log.error "Error adding to load balancers: " + bang.to_s
|
430
447
|
end
|
431
448
|
end
|
432
449
|
|
@@ -469,7 +486,7 @@ module EC2Launcher
|
|
469
486
|
#
|
470
487
|
# @return [AmiDetails] AMI name and id.
|
471
488
|
def find_ami(arch, virtualization, ami_name_match, id = nil)
|
472
|
-
|
489
|
+
@log.info "Searching for AMI..."
|
473
490
|
ami_name = ""
|
474
491
|
ami_id = ""
|
475
492
|
|
@@ -526,7 +543,7 @@ module EC2Launcher
|
|
526
543
|
abort("You MUST either set the AWS_ACCESS_KEY and AWS_SECRET_ACCESS_KEY environment variables or use the command line options.")
|
527
544
|
end
|
528
545
|
|
529
|
-
|
546
|
+
@log.info "Initializing AWS connection..."
|
530
547
|
AWS.config({
|
531
548
|
:access_key_id => aws_access_key,
|
532
549
|
:secret_access_key => aws_secret_access_key
|
@@ -548,7 +565,7 @@ module EC2Launcher
|
|
548
565
|
#
|
549
566
|
# @return [AWS::EC2::Instance] newly created EC2 instance or nil if the launch failed.
|
550
567
|
def launch_instance(hostname, ami_id, availability_zone, key_name, security_group_ids, instance_type, user_data, block_device_mappings = nil, block_device_tags = nil, vpc_subnet = nil)
|
551
|
-
|
568
|
+
@log.warn "Launching instance... #{hostname}"
|
552
569
|
new_instance = nil
|
553
570
|
run_with_backoff(30, 1, "launching instance") do
|
554
571
|
if block_device_mappings.nil? || block_device_mappings.keys.empty?
|
@@ -576,7 +593,7 @@ module EC2Launcher
|
|
576
593
|
end
|
577
594
|
sleep 5
|
578
595
|
|
579
|
-
|
596
|
+
@log.info " Waiting for instance to start up..."
|
580
597
|
sleep 2
|
581
598
|
instance_ready = false
|
582
599
|
until instance_ready
|
@@ -588,13 +605,13 @@ module EC2Launcher
|
|
588
605
|
end
|
589
606
|
|
590
607
|
unless new_instance.status == :running
|
591
|
-
|
608
|
+
@log.fatal "Instance launch failed. Aborting."
|
592
609
|
exit 5
|
593
610
|
end
|
594
611
|
|
595
612
|
##############################
|
596
613
|
# Tag instance
|
597
|
-
|
614
|
+
@log.info "Tagging instance..."
|
598
615
|
run_with_backoff(30, 1, "tag #{new_instance.id}, tag: name, value: #{hostname}") { new_instance.add_tag("Name", :value => hostname) }
|
599
616
|
run_with_backoff(30, 1, "tag #{new_instance.id}, tag: environment, value: #{@environment.name}") { new_instance.add_tag("environment", :value => @environment.name) }
|
600
617
|
run_with_backoff(30, 1, "tag #{new_instance.id}, tag: application, value: #{@application.name}") { new_instance.add_tag("application", :value => @application.name) }
|
@@ -602,7 +619,7 @@ module EC2Launcher
|
|
602
619
|
##############################
|
603
620
|
# Tag volumes
|
604
621
|
unless block_device_tags.empty?
|
605
|
-
|
622
|
+
@log.info "Tagging volumes..."
|
606
623
|
AWS.start_memoizing
|
607
624
|
block_device_tags.keys.each do |device|
|
608
625
|
v = new_instance.block_device_mappings[device].volume
|
@@ -672,7 +689,7 @@ module EC2Launcher
|
|
672
689
|
if fail_on_error
|
673
690
|
abort("ERROR - #{name} directories not found: #{temp_dirs}")
|
674
691
|
else
|
675
|
-
|
692
|
+
@log.warn "WARNING - #{name} directories not found: #{temp_dirs}"
|
676
693
|
end
|
677
694
|
end
|
678
695
|
|
@@ -361,9 +361,9 @@ end
|
|
361
361
|
##############################
|
362
362
|
# EMAIL NOTIFICATION
|
363
363
|
##############################
|
364
|
-
|
365
|
-
unless instance_data["email_notification"].nil?
|
364
|
+
if instance_data["email_notification"]
|
366
365
|
# Email notification through SES
|
366
|
+
puts "Email notification through SES..."
|
367
367
|
AWS.config({
|
368
368
|
:access_key_id => instance_data["email_notification"]["ses_access_key"],
|
369
369
|
:secret_access_key => instance_data["email_notification"]["ses_secret_key"]
|
@@ -376,4 +376,6 @@ unless instance_data["email_notification"].nil?
|
|
376
376
|
:body_text => "Server setup is complete for Host: #{hostname}, Environment: #{options.environ}, Application: #{options.application}",
|
377
377
|
:body_html => "<div>Server setup is complete for:</div><div><strong>Host:</strong> #{hostname}</div><div><strong>Environment:</strong> #{options.environ}</div><div><strong>Application:</strong> #{options.application}</div>"
|
378
378
|
)
|
379
|
+
else
|
380
|
+
puts "Skipping email notification."
|
379
381
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ec2launcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.23
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 1.5.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: log4r
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
description: Tool to manage application configurations and launch new EC2 instances
|
31
47
|
based on the configurations.
|
32
48
|
email:
|
@@ -84,3 +100,4 @@ signing_key:
|
|
84
100
|
specification_version: 3
|
85
101
|
summary: Tool to launch EC2 instances.
|
86
102
|
test_files: []
|
103
|
+
has_rdoc:
|