capify-ec2 1.4.1.pre3 → 1.4.2.pre4
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.md +12 -0
- data/capify-ec2.gemspec +1 -1
- data/lib/capify-ec2.rb +8 -1
- data/lib/capify-ec2/capistrano.rb +47 -23
- data/lib/capify-ec2/version.rb +1 -1
- data/readme.md +21 -0
- metadata +7 -5
data/Changelog.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## 1.4.2.pre4 (Mar 28, 2013)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
|
5
|
+
- Added the ability to run multiple healthchecks per role by specifying an array of them when defining the role.
|
6
|
+
- Improved readability of output from rolling deployments.
|
7
|
+
|
8
|
+
Bugfixes:
|
9
|
+
|
10
|
+
- Error handling improved when working with the 'ec2:ssh' command.
|
11
|
+
|
12
|
+
|
1
13
|
## 1.4.1.pre3 (Mar 1, 2013)
|
2
14
|
|
3
15
|
Features:
|
data/capify-ec2.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "capify-ec2"
|
7
7
|
s.version = Capify::Ec2::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Noah Cantor", "Siddharth Dawara"]
|
9
|
+
s.authors = ["Noah Cantor", "Siddharth Dawara", "Jon Spalding", "Ryan Conway"]
|
10
10
|
s.email = ["capify-ec2@forwardtechnology.co.uk"]
|
11
11
|
s.homepage = "http://github.com/forward/capify-ec2"
|
12
12
|
s.summary = %q{Capify-EC2 is used to generate Capistrano namespaces and tasks from Amazon EC2 instance tags, dynamically building the list of servers to be deployed to.}
|
data/lib/capify-ec2.rb
CHANGED
@@ -45,6 +45,11 @@ class CapifyEc2
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def display_instances
|
48
|
+
unless desired_instances and desired_instances.any?
|
49
|
+
puts "[Capify-EC2] No instances were found using your 'ec2.yml' configuration.".red.bold
|
50
|
+
return
|
51
|
+
end
|
52
|
+
|
48
53
|
# Set minimum widths for the variable length instance attributes.
|
49
54
|
column_widths = { :name_min => 4, :type_min => 4, :dns_min => 5, :roles_min => 5, :options_min => 6 }
|
50
55
|
|
@@ -216,8 +221,10 @@ class CapifyEc2
|
|
216
221
|
def instance_health_by_url(dns, port, path, expected_response, options = {})
|
217
222
|
protocol = options[:https] ? 'https://' : 'http://'
|
218
223
|
uri = URI("#{protocol}#{dns}:#{port}#{path}")
|
219
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
220
224
|
|
225
|
+
puts "[Capify-EC2] Checking '#{uri}' for the content '#{expected_response}'..."
|
226
|
+
|
227
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
221
228
|
result = nil
|
222
229
|
|
223
230
|
begin
|
@@ -39,13 +39,19 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
39
39
|
desc "Allows ssh to instance by id. cap ssh <INSTANCE NAME>"
|
40
40
|
task :ssh do
|
41
41
|
server = variables[:logger].instance_variable_get("@options")[:actions][1]
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
|
43
|
+
if server
|
44
|
+
instance = numeric?(server) ? capify_ec2.desired_instances[server.to_i] : capify_ec2.get_instance_by_name(server)
|
45
|
+
|
46
|
+
if instance and instance.contact_point then
|
47
|
+
port = ssh_options[:port] || 22
|
48
|
+
command = "ssh -p #{port} #{user}@#{instance.contact_point}"
|
49
|
+
puts "Running `#{command}`"
|
50
|
+
exec(command)
|
51
|
+
else
|
52
|
+
puts "[Capify-EC2] Error: No instances were found with instance number '#{server}'.".bold.red
|
53
|
+
exit 1
|
54
|
+
end
|
49
55
|
else
|
50
56
|
puts "[Capify-EC2] Error: You did not specify the instance number, which can be found via the 'ec2:status' command as follows:".bold.red
|
51
57
|
top.ec2.status
|
@@ -99,26 +105,32 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
99
105
|
load_balancer_to_reregister = capify_ec2.deregister_instance_from_elb_by_dns(server_dns) if is_load_balanced
|
100
106
|
|
101
107
|
# Call the standard 'cap deploy' task with our redefined role containing a single server.
|
102
|
-
top.deploy.default
|
108
|
+
# top.deploy.default
|
103
109
|
|
104
110
|
server_roles.each do |a_role|
|
105
111
|
|
106
|
-
# If
|
112
|
+
# If healthcheck(s) are defined for this role, run them.
|
107
113
|
if all_roles[a_role][:options][:healthcheck]
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
114
|
+
healthchecks_for_role = [ all_roles[a_role][:options][:healthcheck] ].flatten
|
115
|
+
|
116
|
+
puts "[Capify-EC2] Starting #{pluralise(healthchecks_for_role.size, 'healthcheck')} for role '#{a_role}'..."
|
117
|
+
|
118
|
+
healthchecks_for_role.each_with_index do |healthcheck_for_role, i|
|
119
|
+
options = {}
|
120
|
+
options[:https] = healthcheck_for_role[:https] ||= false
|
121
|
+
options[:timeout] = healthcheck_for_role[:timeout] ||= 60
|
122
|
+
|
123
|
+
healthcheck = capify_ec2.instance_health_by_url( server_dns,
|
124
|
+
healthcheck_for_role[:port],
|
125
|
+
healthcheck_for_role[:path],
|
126
|
+
healthcheck_for_role[:result],
|
127
|
+
options )
|
128
|
+
if healthcheck
|
129
|
+
puts "[Capify-EC2] Healthcheck #{i+1} of #{healthchecks_for_role.size} for role '#{a_role}' successful.".green.bold
|
130
|
+
else
|
131
|
+
puts "[Capify-EC2] Healthcheck #{i+1} of #{healthchecks_for_role.size} for role '#{a_role}' failed!".red.bold
|
132
|
+
raise CapifyEC2RollingDeployError.new("Healthcheck timeout exceeded", server_dns)
|
133
|
+
end
|
122
134
|
end
|
123
135
|
end
|
124
136
|
|
@@ -142,11 +154,13 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
142
154
|
failed_deploys << e.dns
|
143
155
|
puts "[Capify-EC2]"
|
144
156
|
puts "[Capify-EC2] Deployment aborted due to error: #{e}!".red.bold
|
157
|
+
puts "[Capify-EC2]" if load_balancer_to_reregister
|
145
158
|
puts "[Capify-EC2] Note: Instance '#{instance_dns_with_name_tag(e.dns)}' was removed from the ELB '#{load_balancer_to_reregister.id}' and should be manually checked and reregistered.".red.bold if load_balancer_to_reregister
|
146
159
|
rescue => e
|
147
160
|
failed_deploys << roles.values.first.servers.first.host
|
148
161
|
puts "[Capify-EC2]"
|
149
162
|
puts "[Capify-EC2] Deployment aborted due to error: #{e}!".red.bold
|
163
|
+
puts "[Capify-EC2]" if load_balancer_to_reregister
|
150
164
|
puts "[Capify-EC2] Note: Instance '#{instance_dns_with_name_tag(roles.values.first.servers.first.host)}' was removed from the ELB '#{load_balancer_to_reregister.id}' and should be manually checked and reregistered.".red.bold if load_balancer_to_reregister
|
151
165
|
else
|
152
166
|
puts "[Capify-EC2]"
|
@@ -265,6 +279,16 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
265
279
|
def numeric?(object)
|
266
280
|
true if Float(object) rescue false
|
267
281
|
end
|
282
|
+
|
283
|
+
def pluralise(n, singular, plural=nil)
|
284
|
+
if n == 1
|
285
|
+
"#{singular}"
|
286
|
+
elsif plural
|
287
|
+
"#{plural}"
|
288
|
+
else
|
289
|
+
"#{singular}s"
|
290
|
+
end
|
291
|
+
end
|
268
292
|
|
269
293
|
def remove_default_roles
|
270
294
|
roles.reject! { true }
|
data/lib/capify-ec2/version.rb
CHANGED
data/readme.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
Capify-EC2 is used to generate Capistrano namespaces and tasks from Amazon EC2 instance tags, dynamically building the list of servers to be deployed to.
|
4
4
|
|
5
|
+
### Pre-release
|
6
|
+
|
7
|
+
This pre-release version of Capify-EC2 is currently in public testing, please open a Github issue if you are experiencing difficulties.
|
8
|
+
|
5
9
|
|
6
10
|
### Installation
|
7
11
|
|
@@ -356,6 +360,23 @@ ec2_roles :name => "web",
|
|
356
360
|
|
357
361
|
Sets a 10 second timeout, and performs the health check over HTTPS.
|
358
362
|
|
363
|
+
You can run multiple different healthchecks for a role by specifying the healthcheck as an array instead:
|
364
|
+
|
365
|
+
```ruby
|
366
|
+
ec2_roles :name => "web",
|
367
|
+
:variables => {
|
368
|
+
:healthcheck => [{
|
369
|
+
:path => '/status',
|
370
|
+
:port => 80,
|
371
|
+
:result => 'OK'
|
372
|
+
}, {
|
373
|
+
:path => '/other_status',
|
374
|
+
:port => 81,
|
375
|
+
:result => 'OK'
|
376
|
+
}]
|
377
|
+
}
|
378
|
+
```
|
379
|
+
|
359
380
|
##### Usage with Elastic Load Balancers
|
360
381
|
|
361
382
|
You can have Capify-EC2 automatically deregister and reregister an instance from whichever ELB it is associated with, before and after the deployment, by setting ':load_balanced' to 'true' in the role definition, for example:
|
metadata
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capify-ec2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 967365859
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
-
|
9
|
+
- 2
|
10
10
|
- pre
|
11
|
-
-
|
12
|
-
version: 1.4.
|
11
|
+
- 4
|
12
|
+
version: 1.4.2.pre4
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Noah Cantor
|
16
16
|
- Siddharth Dawara
|
17
|
+
- Jon Spalding
|
18
|
+
- Ryan Conway
|
17
19
|
autorequire:
|
18
20
|
bindir: bin
|
19
21
|
cert_chain: []
|
20
22
|
|
21
|
-
date: 2013-03-
|
23
|
+
date: 2013-03-28 00:00:00 Z
|
22
24
|
dependencies:
|
23
25
|
- !ruby/object:Gem::Dependency
|
24
26
|
name: fog
|