ec2launcher 1.6.15 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +28 -0
- data/Rakefile +11 -2
- data/lib/ec2launcher/block_device_builder.rb +6 -4
- data/lib/ec2launcher/dynamic_hostname_generator.rb +56 -0
- data/lib/ec2launcher/hostname_generator.rb +30 -20
- data/lib/ec2launcher/hostnames/host_name_generation.rb +42 -0
- data/lib/ec2launcher/init_options.rb +10 -0
- data/lib/ec2launcher/route53.rb +6 -0
- data/lib/ec2launcher/version.rb +1 -1
- data/lib/ec2launcher.rb +98 -50
- data/startup-scripts/setup.rb +23 -15
- data/startup-scripts/setup_instance.rb +66 -5
- data/test/spec/dynamic_hostname_generator_spec.rb +29 -0
- data/test/spec/hostnames/host_name_generation_spec.rb +42 -0
- data/test/test_helper.rb +0 -1
- data/test/unit/block_device_builder.rb +102 -0
- data/test/{ec2launcher → unit}/dsl/config_parser_test.rb +1 -0
- data/test/unit/route53_test.rb +184 -0
- metadata +25 -19
- data/.gitignore +0 -17
- data/bin/ec2launcher +0 -38
- data/ec2launcher.gemspec +0 -24
- data/yard_extensions/dsl_attribute_handler.rb +0 -14
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MWIwYTY3YTRlYTllOTUxN2E2MTI2NmI2MDdkNGY4YjZkZDRiYzZjZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NGNkMzJjMjIyODE5ZWQxYTk5MGEwM2UwMTRiNDY1ZTNiNDBhNmUwNQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OTAwNWFhYjAwZWFlYTVhMjdiMzkxODUzY2Y1YmY4MDlkZjI3ZDQ5YjBjOTc0
|
10
|
+
MmUwM2UxMmVkMjE5MDA5NmY0ODI1ZDlmMDIxZGZhODU1NDgxODgyOGFhMDEw
|
11
|
+
ODQ4YTQ3YmJmYjNlZTBmYzA5NTIwMzZjOTBjNTBiMDg3NGMwZGE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MGQwYmU3NDNlMTQ5ZjQ0MTdjYjI0OTQwNDZhMWExZmQyN2IwMjYyZDc2NTE5
|
14
|
+
MGE2YWVjZGMwNWVhODQ2YjQwZmJkZjhmY2VmNmM2Y2VkMDEwNjAzZDczYWI1
|
15
|
+
YjBiNDFiZTBiMmU5Mjk1ZDEwMTI0MzIxZTRiNjMxNzdkNWM0NzE=
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 1.7.0
|
2
|
+
|
3
|
+
* New optional "dynamic" naming convention that leverages the instance id instead of a sequential number. Useful for ASGs.
|
4
|
+
* New command line option "--dynamic-name" that forces use of new naming convention.
|
5
|
+
|
6
|
+
## 1.6.15
|
7
|
+
|
8
|
+
* Fixed a problem parsing the setup JSON on MRI rubies later than 1.9.3-p194, which was the root cause of the block device handling issues.
|
9
|
+
|
1
10
|
## 1.6.14
|
2
11
|
|
3
12
|
* Undo block device changes.
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
ec2launcher (1.7.0)
|
5
|
+
aws-sdk (>= 1.8.0)
|
6
|
+
log4r
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
aws-sdk (1.9.5)
|
12
|
+
json (~> 1.4)
|
13
|
+
nokogiri (>= 1.4.4)
|
14
|
+
uuidtools (~> 2.1)
|
15
|
+
json (1.7.7)
|
16
|
+
log4r (1.1.10)
|
17
|
+
minitest (4.1.0)
|
18
|
+
nokogiri (1.5.9)
|
19
|
+
rake (0.9.2.2)
|
20
|
+
uuidtools (2.1.4)
|
21
|
+
|
22
|
+
PLATFORMS
|
23
|
+
ruby
|
24
|
+
|
25
|
+
DEPENDENCIES
|
26
|
+
ec2launcher!
|
27
|
+
minitest
|
28
|
+
rake
|
data/Rakefile
CHANGED
@@ -1,9 +1,18 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require "bundler/gem_tasks"
|
3
3
|
require 'rake/testtask'
|
4
|
+
|
4
5
|
Rake::TestTask.new do |t|
|
6
|
+
t.name = "testspec"
|
5
7
|
t.libs << 'lib/ec2launcher'
|
6
|
-
t.
|
8
|
+
t.pattern = "test/spec/**/*_spec.rb"
|
7
9
|
t.verbose = true
|
8
10
|
end
|
9
|
-
|
11
|
+
|
12
|
+
Rake::TestTask.new do |t|
|
13
|
+
t.libs << 'lib/ec2launcher'
|
14
|
+
t.pattern = "test/unit/**/*_test.rb"
|
15
|
+
t.verbose = true
|
16
|
+
end
|
17
|
+
|
18
|
+
task :default => [:test, :testspec]
|
@@ -14,10 +14,11 @@ module EC2Launcher
|
|
14
14
|
attr_reader :block_device_mappings
|
15
15
|
attr_reader :block_device_tags
|
16
16
|
|
17
|
-
# @param [AWS::EC2] ec2
|
18
|
-
# @param [Integer, nil] volume_size
|
17
|
+
# @param [AWS::EC2] ec2 Interface to ec2
|
18
|
+
# @param [Integer, nil] volume_size Size of new EBS volumes. If set to nil, uses EC2Launcher::Defaults::DEFAULT_VOLUME_SIZE.
|
19
|
+
# @param [Log4r, nil] logger Optional logger.
|
19
20
|
#
|
20
|
-
def initialize(ec2, volume_size = nil)
|
21
|
+
def initialize(ec2, volume_size = nil, logger = nil)
|
21
22
|
@ec2 = ec2
|
22
23
|
@block_size = volume_size
|
23
24
|
@volume_size ||= EC2Launcher::DEFAULT_VOLUME_SIZE
|
@@ -26,7 +27,8 @@ module EC2Launcher
|
|
26
27
|
@block_device_tags = {}
|
27
28
|
|
28
29
|
begin
|
29
|
-
@log =
|
30
|
+
@log = logger
|
31
|
+
@log ||= Log4r::Logger['ec2launcher']
|
30
32
|
rescue
|
31
33
|
end
|
32
34
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012-2013 Sean Laurent
|
3
|
+
#
|
4
|
+
require 'rubygems'
|
5
|
+
require 'aws-sdk'
|
6
|
+
|
7
|
+
require 'ec2launcher/hostnames/host_name_generation'
|
8
|
+
|
9
|
+
module EC2Launcher
|
10
|
+
# Helper class to generate unique host names
|
11
|
+
class DynamicHostnameGenerator
|
12
|
+
include HostNames::HostNameGeneration
|
13
|
+
|
14
|
+
# Creates a new generator for dynamic host names.
|
15
|
+
#
|
16
|
+
# @param [String] prefix Optional prefix for the hostname.
|
17
|
+
# @param [String] suffix Optional suffix for the hostname.
|
18
|
+
def initialize(prefix = nil, suffix = nil)
|
19
|
+
@prefix = prefix
|
20
|
+
@suffix = suffix
|
21
|
+
|
22
|
+
if prefix
|
23
|
+
@prefix = prefix.slice(0, prefix.length - 1) if prefix =~ /[.]$/
|
24
|
+
end
|
25
|
+
|
26
|
+
if suffix
|
27
|
+
@suffix = suffix.slice(1, suffix.length) if suffix =~ /^[.]/
|
28
|
+
@suffix = @suffix.slice(0, @suffix.length - 1) if @suffix =~ /[.]$/
|
29
|
+
end
|
30
|
+
|
31
|
+
@prefix = nil if @prefix && @prefix.size < 1
|
32
|
+
@suffix = nil if @suffix && @suffix.size < 1
|
33
|
+
end
|
34
|
+
|
35
|
+
# Given an instance id, generates a dynamic short hostname typically in the form:
|
36
|
+
#
|
37
|
+
# prefix + INSTANCE ID + application + environment
|
38
|
+
#
|
39
|
+
# Examples:
|
40
|
+
# 9803da2.web.prod (no prefix)
|
41
|
+
# app-d709aa2ab.server.dev (prefix = "app-")
|
42
|
+
#
|
43
|
+
# @param [String] instance_id AWS EC2 instance id
|
44
|
+
#
|
45
|
+
def generate_dynamic_hostname(instance_id)
|
46
|
+
instance_id_name = (instance_id =~ /^i-/ ? instance_id.gsub(/^i-/, '') : instance_id)
|
47
|
+
|
48
|
+
short_name = @prefix
|
49
|
+
short_name ||= ""
|
50
|
+
short_name += instance_id_name
|
51
|
+
short_name += ".#{@suffix}" if @suffix
|
52
|
+
|
53
|
+
short_name
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -5,26 +5,32 @@ require 'rubygems'
|
|
5
5
|
require 'aws-sdk'
|
6
6
|
|
7
7
|
require 'ec2launcher/backoff_runner'
|
8
|
+
require 'ec2launcher/dynamic_hostname_generator'
|
9
|
+
require 'ec2launcher/hostnames/host_name_generation'
|
8
10
|
|
9
11
|
module EC2Launcher
|
10
12
|
# Helper class to generate sequential, numbered host names
|
11
13
|
class HostnameGenerator
|
12
14
|
include BackoffRunner
|
15
|
+
include HostNames::HostNameGeneration
|
16
|
+
|
17
|
+
attr_reader :prefix
|
18
|
+
attr_reader :suffix
|
13
19
|
|
14
20
|
#
|
15
21
|
# @param [AWS::EC2] ec2 EC2 object used to query for existing instances
|
16
22
|
# @param [EC2Launcher::Environment] environment Environment to use for generating host names
|
17
|
-
# @param [EC2Launcher::Application] application Application to use for generating
|
23
|
+
# @param [EC2Launcher::Application] application Application to use for generating host names
|
18
24
|
def initialize(ec2, environment, application)
|
19
25
|
@ec2 = ec2
|
20
|
-
|
26
|
+
@server_name_cache = nil
|
21
27
|
|
22
28
|
@prefix = application.basename
|
23
29
|
@prefix ||= application.name
|
24
30
|
|
25
31
|
@env_suffix = environment.short_name
|
26
32
|
@env_suffix ||= environment.name
|
27
|
-
|
33
|
+
|
28
34
|
@suffix = @env_suffix
|
29
35
|
unless application.name_suffix.nil?
|
30
36
|
@suffix = "#{application.name_suffix}.#{@env_suffix}"
|
@@ -34,6 +40,27 @@ module EC2Launcher
|
|
34
40
|
|
35
41
|
# Load and cache instance names
|
36
42
|
load_instances(@prefix, @suffix)
|
43
|
+
|
44
|
+
@dynamic_generator = EC2Launcher::DynamicHostnameGenerator.new(nil, "#{@prefix}.#{@suffix}")
|
45
|
+
end
|
46
|
+
|
47
|
+
# Given an instance id, generates a dynamic short hostname typically in the form:
|
48
|
+
#
|
49
|
+
# prefix + INSTANCE ID + application + environment
|
50
|
+
#
|
51
|
+
# Examples:
|
52
|
+
# 9803da2.web.prod (no prefix)
|
53
|
+
# app-d709aa2ab.server.dev (prefix = "app-")
|
54
|
+
#
|
55
|
+
# @param [String] instance_id AWS EC2 instance id
|
56
|
+
#
|
57
|
+
def generate_dynamic_hostname(instance_id)
|
58
|
+
short_name = @dynamic_generator.generate_dynamic_hostname(instance_id)
|
59
|
+
|
60
|
+
# Cache the new hostname
|
61
|
+
@server_name_cache << short_name
|
62
|
+
|
63
|
+
short_name
|
37
64
|
end
|
38
65
|
|
39
66
|
# Generates a new host name and automatically caches it
|
@@ -51,23 +78,6 @@ module EC2Launcher
|
|
51
78
|
short_name
|
52
79
|
end
|
53
80
|
|
54
|
-
def generate_long_name(short_hostname, domain_name = nil)
|
55
|
-
hostname = short_hostname
|
56
|
-
unless domain_name.nil?
|
57
|
-
hostname += ".#{domain_name}"
|
58
|
-
end
|
59
|
-
|
60
|
-
hostname
|
61
|
-
end
|
62
|
-
|
63
|
-
def generate_short_name(long_name, domain_name = nil)
|
64
|
-
short_hostname = long_name
|
65
|
-
unless domain_name.nil?
|
66
|
-
short_hostname = long_name.gsub(/.#{domain_name}/, '')
|
67
|
-
end
|
68
|
-
short_hostname
|
69
|
-
end
|
70
|
-
|
71
81
|
private
|
72
82
|
|
73
83
|
# Loads and caches instance host names
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012-2013 Sean Laurent
|
3
|
+
#
|
4
|
+
module EC2Launcher
|
5
|
+
module HostNames
|
6
|
+
module HostNameGeneration
|
7
|
+
# Given a short host name and domain name, generate a Fully Qualified Domain Name.
|
8
|
+
#
|
9
|
+
# @param [String] short_hostname Shortened host name.
|
10
|
+
# @param [String] domain_name Optional domain name ie 'example.com'
|
11
|
+
def generate_fqdn(short_hostname, domain_name = nil)
|
12
|
+
raise ArgumentError, 'short_hostname is invalid' if short_hostname.nil?
|
13
|
+
|
14
|
+
hostname = short_hostname
|
15
|
+
unless domain_name.nil?
|
16
|
+
unless hostname =~ /[.]$/ || domain_name =~ /^[.]/
|
17
|
+
hostname += "."
|
18
|
+
end
|
19
|
+
hostname += domain_name
|
20
|
+
end
|
21
|
+
|
22
|
+
hostname
|
23
|
+
end
|
24
|
+
|
25
|
+
# Given a FQDN and a domain name, produce a shortened version of the host name
|
26
|
+
# without the domain.
|
27
|
+
#
|
28
|
+
# @param [String] long_name FQDN ie 'foo1.prod.example.com'
|
29
|
+
# @param [String] domain_name Optional domain name ie 'example.com'
|
30
|
+
def generate_short_name(long_name, domain_name = nil)
|
31
|
+
raise ArgumentError, 'long_name is invalid' if long_name.nil?
|
32
|
+
|
33
|
+
short_hostname = long_name
|
34
|
+
unless domain_name.nil?
|
35
|
+
short_hostname = long_name.gsub(/#{domain_name}/, '')
|
36
|
+
short_hostname = short_hostname.slice(0, short_hostname.length - 1) if short_hostname =~ /[.]$/
|
37
|
+
end
|
38
|
+
short_hostname
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -108,9 +108,17 @@ EOH
|
|
108
108
|
@options.skip_setup = true
|
109
109
|
end
|
110
110
|
|
111
|
+
opts.on("--pretty-print", "Use pretty format for JSON user-data. Defaults to off. Only recommended for testing.") do
|
112
|
+
@options.pretty_print = true
|
113
|
+
end
|
114
|
+
|
111
115
|
opts.separator ""
|
112
116
|
opts.separator "Launch overrides:"
|
113
117
|
|
118
|
+
opts.on("-d", "--dynamic-name", "Dynamically set the host name based on instance id.") do |dynamic_name|
|
119
|
+
@options.dynamic_name = dynamic_name
|
120
|
+
end
|
121
|
+
|
114
122
|
opts.on("-h", "--hostname NAME", String, "The name for the new server.") do |hostname|
|
115
123
|
@options.hostname = hostname
|
116
124
|
end
|
@@ -192,6 +200,7 @@ EOH
|
|
192
200
|
@options.skip_setup = false
|
193
201
|
|
194
202
|
@options.ami_id = nil
|
203
|
+
@options.dynamic_name = false
|
195
204
|
@options.hostname = nil
|
196
205
|
@options.zone = nil
|
197
206
|
@options.instance_type = nil
|
@@ -200,6 +209,7 @@ EOH
|
|
200
209
|
@options.snapshot_removal = true
|
201
210
|
@options.force = false
|
202
211
|
|
212
|
+
@options.pretty_print = false
|
203
213
|
@options.verbosity = :normal
|
204
214
|
|
205
215
|
@options.directory = "./"
|
data/lib/ec2launcher/route53.rb
CHANGED
@@ -71,12 +71,15 @@ module EC2Launcher
|
|
71
71
|
#
|
72
72
|
def delete_record_by_name(hostname, record_type = "A", log_errors = true)
|
73
73
|
# Search for the record
|
74
|
+
delete_result = true
|
74
75
|
record = find_record(hostname, record_type)
|
75
76
|
if record
|
76
77
|
delete_record(record.name, record.type, record.ttl, record.value, log_errors)
|
77
78
|
else
|
79
|
+
delete_result = false
|
78
80
|
@log.warn "Route53 '#{record_type}' record for '#{hostname}' not found!" if log_errors
|
79
81
|
end
|
82
|
+
delete_result
|
80
83
|
end
|
81
84
|
|
82
85
|
# Deletes a DNS record from Route53.
|
@@ -88,6 +91,7 @@ module EC2Launcher
|
|
88
91
|
# @param [Boolean] log_errors Log errors or not. False quietly ignores errors.
|
89
92
|
#
|
90
93
|
def delete_record(name, type, ttl, value, log_errors = true)
|
94
|
+
delete_result = true
|
91
95
|
begin
|
92
96
|
@route53.client.change_resource_record_sets({
|
93
97
|
:hosted_zone_id => @hosted_zone_id,
|
@@ -107,7 +111,9 @@ module EC2Launcher
|
|
107
111
|
})
|
108
112
|
rescue StandardError => bang
|
109
113
|
@log.error "Error deleting A record from Route53: #{bang}" if log_errors
|
114
|
+
delete_result = false
|
110
115
|
end
|
116
|
+
delete_result
|
111
117
|
end
|
112
118
|
|
113
119
|
# Searches for a record with the specified name and type.
|
data/lib/ec2launcher/version.rb
CHANGED
data/lib/ec2launcher.rb
CHANGED
@@ -241,36 +241,38 @@ module EC2Launcher
|
|
241
241
|
##############################
|
242
242
|
# HOSTNAME
|
243
243
|
##############################
|
244
|
-
hostname_generator = EC2Launcher::HostnameGenerator.new(@ec2, @environment, @application)
|
244
|
+
@hostname_generator = EC2Launcher::HostnameGenerator.new(@ec2, @environment, @application)
|
245
245
|
short_hostnames = []
|
246
246
|
fqdn_names = []
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
if @options.hostname.nil?
|
256
|
-
short_hostname = hostname_generator.generate_hostname()
|
257
|
-
long_hostname = hostname_generator.generate_long_name(short_hostname, @domain_name)
|
247
|
+
unless @options.dynamic_name
|
248
|
+
if @options.count > 1
|
249
|
+
1.upto(@options.count).each do |i|
|
250
|
+
short_hostname = @hostname_generator.generate_hostname()
|
251
|
+
long_hostname = @hostname_generator.generate_fqdn(short_hostname, @domain_name)
|
252
|
+
short_hostnames << short_hostname
|
253
|
+
fqdn_names << long_hostname
|
254
|
+
end
|
258
255
|
else
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
256
|
+
if @options.hostname.nil?
|
257
|
+
short_hostname = @hostname_generator.generate_hostname()
|
258
|
+
long_hostname = @hostname_generator.generate_fqdn(short_hostname, @domain_name)
|
259
|
+
else
|
260
|
+
long_hostname = @options.hostname
|
261
|
+
short_hostname = @hostname_generator.generate_short_name(long_hostname, @environment.domain_name)
|
262
|
+
if long_hostname == short_hostname
|
263
|
+
long_hostname = @hostname_generator.generate_fqdn(short_hostname, @environment.domain_name)
|
264
|
+
end
|
263
265
|
end
|
266
|
+
short_hostnames << short_hostname
|
267
|
+
fqdn_names << long_hostname
|
264
268
|
end
|
265
|
-
short_hostnames << short_hostname
|
266
|
-
fqdn_names << long_hostname
|
267
269
|
end
|
268
270
|
|
269
271
|
##############################
|
270
272
|
# Block devices
|
271
273
|
##############################
|
272
|
-
block_device_builder = EC2Launcher::BlockDeviceBuilder.new(@ec2, @options.volume_size)
|
273
|
-
block_device_mappings = block_device_builder.generate_block_devices(instance_type, @environment, @application, @options.clone_host)
|
274
|
+
@block_device_builder = EC2Launcher::BlockDeviceBuilder.new(@ec2, @options.volume_size)
|
275
|
+
block_device_mappings = @block_device_builder.generate_block_devices(instance_type, @environment, @application, @options.clone_host)
|
274
276
|
|
275
277
|
##############################
|
276
278
|
# ELB
|
@@ -341,8 +343,12 @@ module EC2Launcher
|
|
341
343
|
@log.info "VPC Subnet : #{subnet} (#{cidr_block})"
|
342
344
|
end
|
343
345
|
@log.info ""
|
344
|
-
|
345
|
-
|
346
|
+
if @options.dynamic_name
|
347
|
+
@log.info "Name : **dynamic**"
|
348
|
+
else
|
349
|
+
fqdn_names.each do |fqdn|
|
350
|
+
@log.info "Name : #{fqdn}"
|
351
|
+
end
|
346
352
|
end
|
347
353
|
|
348
354
|
unless block_device_mappings.empty?
|
@@ -387,19 +393,24 @@ module EC2Launcher
|
|
387
393
|
}
|
388
394
|
|
389
395
|
# Quit if we're only displaying the defaults
|
390
|
-
if @options.show_defaults
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
@log.info "---user-data---"
|
400
|
-
@log.info user_data
|
401
|
-
@log.info "---user-data---"
|
396
|
+
exit 0 if @options.show_defaults
|
397
|
+
|
398
|
+
if @options.show_user_data
|
399
|
+
custom_launch_options = launch_options
|
400
|
+
unless @options.dynamic_name
|
401
|
+
custom_launch_options = launch_options.merge({
|
402
|
+
:fqdn => fqdn_names[0],
|
403
|
+
:short_name => short_hostnames[0]
|
404
|
+
})
|
402
405
|
end
|
406
|
+
|
407
|
+
user_data = build_launch_command(custom_launch_options)
|
408
|
+
|
409
|
+
@log.info ""
|
410
|
+
@log.info "---user-data---"
|
411
|
+
@log.info user_data
|
412
|
+
@log.info "---user-data---"
|
413
|
+
|
403
414
|
exit 0
|
404
415
|
end
|
405
416
|
|
@@ -408,11 +419,20 @@ module EC2Launcher
|
|
408
419
|
##############################
|
409
420
|
@log.warn ""
|
410
421
|
instances = []
|
411
|
-
|
412
|
-
|
422
|
+
new_instance_names = []
|
423
|
+
0.upto(@options.count - 1).each do |i|
|
424
|
+
fqdn = nil
|
425
|
+
short_hostname = nil
|
426
|
+
|
427
|
+
unless @options.dynamic_name
|
428
|
+
fqdn = fqdn_names[i]
|
429
|
+
short_hostname = short_hostnames[i]
|
430
|
+
end
|
431
|
+
|
432
|
+
block_device_tags = @block_device_builder.generate_device_tags(fqdn, short_hostname, @environment.name, @application.block_devices)
|
413
433
|
launch_options.merge!({
|
414
|
-
:fqdn =>
|
415
|
-
:short_name =>
|
434
|
+
:fqdn => fqdn,
|
435
|
+
:short_name => short_hostname,
|
416
436
|
:block_device_tags => block_device_tags,
|
417
437
|
})
|
418
438
|
user_data = build_launch_command(launch_options)
|
@@ -420,16 +440,23 @@ module EC2Launcher
|
|
420
440
|
instance = launch_instance(launch_options, user_data)
|
421
441
|
instances << instance
|
422
442
|
|
443
|
+
if @options.dynamic_name
|
444
|
+
short_hostname = @hostname_generator.generate_dynamic_hostname(instance.id)
|
445
|
+
fqdn = @hostname_generator.generate_fqdn(short_hostname, @environment.domain_name)
|
446
|
+
end
|
447
|
+
|
423
448
|
public_dns_name = get_instance_dns(instance, true)
|
424
449
|
private_dns_name = get_instance_dns(instance, false)
|
425
|
-
@log.info "Launched #{
|
450
|
+
@log.info "Launched #{fqdn} (#{instance.id}) [#{public_dns_name} / #{private_dns_name} / #{instance.private_ip_address} ]"
|
451
|
+
|
452
|
+
new_instance_names << fqdn
|
426
453
|
end
|
427
454
|
|
428
455
|
@log.info "********************"
|
429
|
-
|
456
|
+
new_instance_names.each_index do |i|
|
430
457
|
public_dns_name = get_instance_dns(instances[i], true)
|
431
458
|
private_dns_name = get_instance_dns(instances[i], false)
|
432
|
-
@log.warn "** New instance: #{
|
459
|
+
@log.warn "** New instance: #{new_instance_names[i]} | #{instances[i].id} | #{public_dns_name} | #{private_dns_name} | #{instances[i].private_ip_address}"
|
433
460
|
end
|
434
461
|
|
435
462
|
##############################
|
@@ -633,6 +660,12 @@ module EC2Launcher
|
|
633
660
|
exit 5
|
634
661
|
end
|
635
662
|
|
663
|
+
if @options.dynamic_name
|
664
|
+
launch_options[:short_name] = @hostname_generator.generate_dynamic_hostname(new_instance.id)
|
665
|
+
launch_options[:fqdn] = @hostname_generator.generate_fqdn(launch_options[:short_name], @environment.domain_name)
|
666
|
+
launch_options[:block_device_tags] = @block_device_builder.generate_device_tags(launch_options[:fqdn], launch_options[:short_name], @environment.name, @application.block_devices)
|
667
|
+
end
|
668
|
+
|
636
669
|
##############################
|
637
670
|
# Tag instance
|
638
671
|
@log.info "Tagging instance..."
|
@@ -697,11 +730,15 @@ module EC2Launcher
|
|
697
730
|
cmd
|
698
731
|
end
|
699
732
|
|
700
|
-
def load_and_encode_file(
|
701
|
-
pathname = File.join(base_path, filename)
|
733
|
+
def load_and_encode_file(pathname)
|
702
734
|
`cat #{pathname} |gzip -f |base64`
|
703
735
|
end
|
704
736
|
|
737
|
+
def load_and_encode_file_with_path(base_path, filename)
|
738
|
+
pathname = File.join(base_path, filename)
|
739
|
+
load_and_encode_file(pathname)
|
740
|
+
end
|
741
|
+
|
705
742
|
# Builds the launch scripts that should run on the new instance.
|
706
743
|
#
|
707
744
|
# launch_options = {
|
@@ -739,8 +776,16 @@ module EC2Launcher
|
|
739
776
|
'aws_keyfile' => launch_options[:aws_keyfile],
|
740
777
|
'gems' => launch_options[:gems],
|
741
778
|
'packages' => launch_options[:packages],
|
742
|
-
'provisioned_iops' => false
|
779
|
+
'provisioned_iops' => false,
|
780
|
+
'dynamic_name' => @options.dynamic_name,
|
781
|
+
'domain_name' => @environment.domain_name
|
743
782
|
}
|
783
|
+
if @options.dynamic_name
|
784
|
+
# setup_json['dynamic_name_prefix'] = @hostname_generator.prefix
|
785
|
+
setup_json['dynamic_name_suffix'] = "#{@hostname_generator.prefix}.#{@hostname_generator.suffix}"
|
786
|
+
setup_json['route53_zone_id'] = @route53_zone_id
|
787
|
+
end
|
788
|
+
|
744
789
|
setup_json["gem_path"] = @instance_paths.gem_path
|
745
790
|
setup_json["ruby_path"] = @instance_paths.ruby_path
|
746
791
|
setup_json["chef_path"] = @instance_paths.chef_path
|
@@ -762,10 +807,11 @@ module EC2Launcher
|
|
762
807
|
|
763
808
|
##############################
|
764
809
|
# Build launch command
|
810
|
+
json_text = @options.pretty_print ? JSON.pretty_generate(setup_json) : setup_json.to_json
|
765
811
|
user_data = <<EOF
|
766
812
|
#!/bin/bash
|
767
813
|
cat > /tmp/setup.json <<End-Of-Message-JSON
|
768
|
-
#{
|
814
|
+
#{json_text}
|
769
815
|
End-Of-Message-JSON
|
770
816
|
EOF
|
771
817
|
if @environment.use_rvm or @application.use_rvm
|
@@ -783,15 +829,15 @@ EOF
|
|
783
829
|
|
784
830
|
unless @options.skip_setup
|
785
831
|
if @run_url_script_cache.nil?
|
786
|
-
@run_url_script_cache =
|
832
|
+
@run_url_script_cache = load_and_encode_file_with_path(@startup_scripts_dir, "runurl")
|
787
833
|
end
|
788
834
|
|
789
835
|
if @setup_script_cache.nil?
|
790
|
-
@setup_script_cache =
|
836
|
+
@setup_script_cache = load_and_encode_file_with_path(@startup_scripts_dir, "setup.rb")
|
791
837
|
end
|
792
838
|
|
793
839
|
if @setup_instance_script_cache.nil?
|
794
|
-
@setup_instance_script_cache =
|
840
|
+
@setup_instance_script_cache = load_and_encode_file_with_path(@startup_scripts_dir, "setup_instance.rb")
|
795
841
|
end
|
796
842
|
|
797
843
|
# runurl script
|
@@ -822,9 +868,11 @@ EOF
|
|
822
868
|
|
823
869
|
user_data += "\ngem install ec2launcher --no-ri --no-rdoc"
|
824
870
|
|
825
|
-
user_data += "\n#{setup_json['ruby_path']} /tmp/setup.rb -e #{@environment.name} -a #{@application.name}
|
871
|
+
user_data += "\n#{setup_json['ruby_path']} /tmp/setup.rb -e #{@environment.name} -a #{@application.name}"
|
872
|
+
user_data += " -h #{launch_options[:fqdn]}" if launch_options[:fqdn]
|
873
|
+
user_data += " /tmp/setup.json"
|
826
874
|
user_data += " -c #{@options.clone_host}" unless @options.clone_host.nil?
|
827
|
-
user_data += "
|
875
|
+
user_data += " &> /var/log/cloud-startup.log"
|
828
876
|
end
|
829
877
|
|
830
878
|
# Add extra requested commands to the launch sequence
|