capify-ec2 1.5.3 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,3 +2,5 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ .idea
6
+
@@ -1,3 +1,14 @@
1
+ ## 1.6.0 (Aug 26, 2014)
2
+
3
+ Features:
4
+
5
+ - Added a new 'ec2:elbs' command which allows you to list ELBs and the instances registered to them (thanks to stevewoolley).
6
+ - Added the ability to perform post deploy healthchecks using POST requests rather than just GET (thanks alangalvino).
7
+
8
+ Bugfixes:
9
+
10
+ - Fixed load balancer registration / de-registering within EC2 VPC (thanks davie).
11
+
1
12
  ## 1.5.3 (Nov 15, 2013)
2
13
 
3
14
  Bugfixes:
@@ -40,6 +40,7 @@ class CapifyEc2
40
40
  regions = determine_regions()
41
41
 
42
42
  @instances = []
43
+ @elbs = elb.load_balancers
43
44
 
44
45
  regions.each do |region|
45
46
  begin
@@ -130,6 +131,68 @@ class CapifyEc2
130
131
  end
131
132
  end
132
133
 
134
+ def display_elbs
135
+ unless @elbs.any?
136
+ puts "[Capify-EC2] No elastic load balancers were found using your 'ec2.yml' configuration.".red.bold
137
+ return
138
+ end
139
+ puts "Elastic Load Balancers".bold
140
+ puts "#{@ec2_config[:aws_project_tag].bold}: #{@ec2_config[:project_tags].join(', ')}." if @ec2_config[:project_tags].any?
141
+
142
+ # Set minimum widths for the variable length lb attributes.
143
+ column_widths = { :id_min => 4, :dns_min => 4, :zone_min => 5}
144
+
145
+ # Find the longest attribute across all instances, to format the columns properly.
146
+ column_widths[:id] = @elbs.map{|i| i.id.to_s.ljust( column_widths[:id_min] ) || ' ' * column_widths[:id_min]}.max_by(&:length).length
147
+ column_widths[:dns] = @elbs.map{|i| i.dns_name || ' ' * column_widths[:dns_min]}.max_by(&:length).length
148
+ column_widths[:zone] = @elbs.map{|i| i.availability_zones.join(",").to_s.ljust( column_widths[:zone_min] ) || ' ' * column_widths[:zone_min]}.max_by(&:length).length
149
+
150
+ # Title row.
151
+ status_output = []
152
+ status_output << 'ID' .ljust( column_widths[:id] ).bold
153
+ status_output << 'DNS' .ljust( column_widths[:dns] ).bold
154
+ status_output << 'Zone' .ljust( column_widths[:zone] ).bold
155
+ puts status_output.join(" ")
156
+
157
+ elbs_found_for_project = false
158
+
159
+ @elbs.each_with_index do |lb, i|
160
+
161
+ status_output = []
162
+ sub_output = []
163
+ lb.instances.each do |instance|
164
+ first_match = @instances.select {|x| instance.include?(x.id)}.first
165
+
166
+ # Skip any instances which don't match the current Project tag, if set.
167
+ if @ec2_config[:project_tags].any?
168
+ break unless @ec2_config[:project_tags].include?(first_match.tags[ @ec2_config[:aws_project_tag] ])
169
+ end
170
+
171
+ elbs_found_for_project = true
172
+
173
+ instance_row = []
174
+ instance_row << " ".ljust( column_widths[:id] ) # indent the length of the id column
175
+ instance_row << "+"
176
+ instance_row << (instance || '') .ljust( 10 ).red
177
+ instance_row << instance_health(lb, first_match) .yellow
178
+ instance_row << (first_match.name || '' ) .cyan
179
+ sub_output << instance_row.join(" ")
180
+ end
181
+
182
+ # Only display the ELB if instances matching the current Project tag were found.
183
+ if sub_output.any?
184
+ status_output << (lb.id || '') .ljust( column_widths[:id] ).green
185
+ status_output << lb.dns_name .ljust( column_widths[:dns] ).blue.bold
186
+ status_output << lb.availability_zones.join(",") .ljust( column_widths[:zone] ).magenta
187
+
188
+ puts status_output.join(" ")
189
+ puts sub_output.join("\n")
190
+ end
191
+ end
192
+
193
+ puts "Capify-EC2] No elastic load balancers were found containing instances tagged with this project.".red.bold unless elbs_found_for_project
194
+ end
195
+
133
196
  def server_names
134
197
  desired_instances.map {|instance| instance.name}
135
198
  end
@@ -161,7 +224,7 @@ class CapifyEc2
161
224
  end
162
225
 
163
226
  def get_instance_by_dns(dns)
164
- desired_instances.select {|instance| instance.dns_name == dns}.first
227
+ desired_instances.select {|instance| instance.contact_point == dns}.first
165
228
  end
166
229
 
167
230
  def instance_health(load_balancer, instance)
@@ -297,7 +360,11 @@ class CapifyEc2
297
360
  begin
298
361
  Timeout::timeout(options[:timeout]) do
299
362
  begin
300
- result = http.get(uri.path)
363
+ if(options[:via].to_s.downcase == "post")
364
+ result = http.post(uri.path, options[:data])
365
+ else
366
+ result = http.get(uri.path)
367
+ end
301
368
  raise "Server responded with '#{result.code}: #{result.body}', expected '#{expected_response}'" unless response_matches_expected?(result.body, expected_response)
302
369
  rescue => e
303
370
  puts "[Capify-EC2] Unexpected response: #{e}..."
@@ -14,6 +14,11 @@ Capistrano::Configuration.instance(:must_exist).load do
14
14
  capify_ec2.display_instances
15
15
  end
16
16
 
17
+ desc "Prints out all ec2 load balancers"
18
+ task :elbs do
19
+ capify_ec2.display_elbs
20
+ end
21
+
17
22
  desc "Deregisters instance from its ELB"
18
23
  task :deregister_instance do
19
24
  instance_name = variables[:logger].instance_variable_get("@options")[:actions].first
@@ -1,6 +1,6 @@
1
1
  module Capify
2
2
  module Ec2
3
- VERSION = "1.5.3"
3
+ VERSION = "1.6.0"
4
4
  end
5
5
  end
6
6
 
data/readme.md CHANGED
@@ -2,7 +2,7 @@
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
- __Note__: Capistrano 3 is completely incompatible with Capistrano 2, and therefore Capify-EC2 will not function with Capistrano 3.
5
+ __Note__: Capistrano 3 is completely incompatible with Capistrano 2, and therefore Capify-EC2 will not function with Capistrano 3. If you are using Capistrano 3, you can use [Cap-EC2](https://github.com/forward3d/cap-ec2), however note that the configuration (`config/ec2.yml`) is not compatible between Capify-EC2 and Cap-EC2.
6
6
 
7
7
 
8
8
 
@@ -149,7 +149,7 @@ In our examples, imagine that you have three servers on EC2 named and tagged as
149
149
  You need to add a call to `ec2_roles` in your `deploy.rb`, like so:
150
150
 
151
151
  ```ruby
152
- ec2_roles {:name => :web}
152
+ ec2_roles :name => :web
153
153
  ```
154
154
 
155
155
  This will generate the following tasks:
@@ -172,7 +172,7 @@ end
172
172
  Note that there are no tasks created for 'server-2', as it does not have the role 'web'. If we were to change the `ec2_roles` definition in your `deploy.rb` to the following:
173
173
 
174
174
  ```ruby
175
- ec2_roles {:name => :db}
175
+ ec2_roles :name => :db
176
176
  ```
177
177
 
178
178
  Then we will instead see the following tasks generated:
@@ -237,7 +237,7 @@ end
237
237
  You can define custom variables which will be set as standard Capistrano variables within the scope of the role you define them one, for example:
238
238
 
239
239
  ```ruby
240
- ec2_roles {:name=>"web", :variables => {:rails_env => 'staging'}}
240
+ ec2_roles :name=>"web", :variables => {:rails_env => 'staging'}
241
241
  ```
242
242
 
243
243
  In this case, instances that that are tagged with the 'web' role will have the custom variable 'rails_env' available to them in any tasks they use. The following tasks would be generated:
@@ -317,7 +317,7 @@ end
317
317
  As well as defining Options at an instance level via EC2 tags, you can define an Option in your `deploy.rb` at the same time as defining the role, as follows:
318
318
 
319
319
  ```ruby
320
- ec2_roles {:name=>"web", :options=>{:worker=>"server-C"}}
320
+ ec2_roles :name=>"web", :options=>{:worker=>"server-C"}
321
321
  ```
322
322
 
323
323
  In this case, you set the value of `:worker` equal to the instance name you want to be a worker. The task definition remains the same:
@@ -490,6 +490,23 @@ ec2_roles :name => "web",
490
490
  }
491
491
  ```
492
492
 
493
+ By default, healthchecks are made using GET requests, but you make can use POST instead by specifying `:via` as either `:post` or `'POST'` and adding ':data' attributes, as follows:
494
+
495
+ ```ruby
496
+ ec2_roles :name => "web",
497
+ :variables => {
498
+ :healthcheck => {
499
+ :path => '/status',
500
+ :port => 80,
501
+ :result => '{ json_response: as_string }'
502
+ :https => true,
503
+ :timeout => 10,
504
+ :via => :post,
505
+ :data => '{ json_request: as_string }'
506
+ }
507
+ }
508
+ ```
509
+
493
510
  ##### Usage with Elastic Load Balancers
494
511
 
495
512
  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:
@@ -534,6 +551,16 @@ cap ec2:status
534
551
  ```
535
552
 
536
553
 
554
+ #### Viewing ELBs
555
+
556
+ The following command will generate a listing of all ELBs with instances that match your configuration (projects):
557
+
558
+ ```ruby
559
+ cap ec2:elbs
560
+ ```
561
+
562
+ Note: if no `project` tag is specified in your `ec2.yml` configuration, then all ELBs and their associated instances are shown when using this command.
563
+
537
564
 
538
565
  #### Managing Load Balancers
539
566
 
metadata CHANGED
@@ -1,15 +1,10 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: capify-ec2
3
- version: !ruby/object:Gem::Version
4
- hash: 5
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.6.0
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 5
9
- - 3
10
- version: 1.5.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Noah Cantor
14
9
  - Siddharth Dawara
15
10
  - Jon Spalding
@@ -17,65 +12,64 @@ authors:
17
12
  autorequire:
18
13
  bindir: bin
19
14
  cert_chain: []
20
-
21
- date: 2013-11-15 00:00:00 Z
22
- dependencies:
23
- - !ruby/object:Gem::Dependency
15
+ date: 2014-08-26 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
24
18
  name: fog
25
- prerelease: false
26
- requirement: &id001 !ruby/object:Gem::Requirement
19
+ requirement: !ruby/object:Gem::Requirement
27
20
  none: false
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- hash: 39
32
- segments:
33
- - 1
34
- - 12
35
- - 0
21
+ requirements:
22
+ - - ! '>='
23
+ - !ruby/object:Gem::Version
36
24
  version: 1.12.0
37
25
  type: :runtime
38
- version_requirements: *id001
39
- - !ruby/object:Gem::Dependency
40
- name: colored
41
26
  prerelease: false
42
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 1.12.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: colored
35
+ requirement: !ruby/object:Gem::Requirement
43
36
  none: false
44
- requirements:
45
- - - "="
46
- - !ruby/object:Gem::Version
47
- hash: 11
48
- segments:
49
- - 1
50
- - 2
51
- version: "1.2"
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
52
41
  type: :runtime
53
- version_requirements: *id002
54
- - !ruby/object:Gem::Dependency
55
- name: capistrano
56
42
  prerelease: false
57
- requirement: &id003 !ruby/object:Gem::Requirement
43
+ version_requirements: !ruby/object:Gem::Requirement
58
44
  none: false
59
- requirements:
45
+ requirements:
46
+ - - '='
47
+ - !ruby/object:Gem::Version
48
+ version: '1.2'
49
+ - !ruby/object:Gem::Dependency
50
+ name: capistrano
51
+ requirement: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
60
54
  - - ~>
61
- - !ruby/object:Gem::Version
62
- hash: 31
63
- segments:
64
- - 2
65
- - 14
66
- version: "2.14"
55
+ - !ruby/object:Gem::Version
56
+ version: '2.14'
67
57
  type: :runtime
68
- version_requirements: *id003
69
- description: 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.
70
- email:
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ~>
63
+ - !ruby/object:Gem::Version
64
+ version: '2.14'
65
+ description: Capify-EC2 is used to generate Capistrano namespaces and tasks from Amazon
66
+ EC2 instance tags, dynamically building the list of servers to be deployed to.
67
+ email:
71
68
  - capify-ec2@forwardtechnology.co.uk
72
69
  executables: []
73
-
74
70
  extensions: []
75
-
76
71
  extra_rdoc_files: []
77
-
78
- files:
72
+ files:
79
73
  - .gitignore
80
74
  - Changelog.md
81
75
  - Gemfile
@@ -88,37 +82,29 @@ files:
88
82
  - lib/capify-ec2/version.rb
89
83
  - readme.md
90
84
  homepage: http://github.com/forward/capify-ec2
91
- licenses:
85
+ licenses:
92
86
  - MIT
93
87
  post_install_message:
94
88
  rdoc_options: []
95
-
96
- require_paths:
89
+ require_paths:
97
90
  - lib
98
- required_ruby_version: !ruby/object:Gem::Requirement
91
+ required_ruby_version: !ruby/object:Gem::Requirement
99
92
  none: false
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- hash: 3
104
- segments:
105
- - 0
106
- version: "0"
107
- required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
98
  none: false
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- hash: 3
113
- segments:
114
- - 0
115
- version: "0"
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
116
103
  requirements: []
117
-
118
104
  rubyforge_project: capify-ec2
119
- rubygems_version: 1.8.15
105
+ rubygems_version: 1.8.23
120
106
  signing_key:
121
107
  specification_version: 3
122
- summary: 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.
108
+ summary: Capify-EC2 is used to generate Capistrano namespaces and tasks from Amazon
109
+ EC2 instance tags, dynamically building the list of servers to be deployed to.
123
110
  test_files: []
124
-