ec2launcher 1.0.22 → 1.0.23
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/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:
|