cap3-elb 0.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f0cbf43b4f3d4cc5e1cda8080a3d504c94f77ec8
4
+ data.tar.gz: 35c7785fd21fd5f67ccb3eb1a91abab7e7389830
5
+ SHA512:
6
+ metadata.gz: 72960d53bcc040f8fbbdbab0dfe188fdb2aacb787d89be6bb113f0c06016a3f2a3797604b3f803dfbc8b5337969855a69f3dcb5ff835ceef48a37691b6444552
7
+ data.tar.gz: c207cd3ea003bc83674a2d5a58c5795584dd27394b784d9b2b008c885e309ea368c33cc71e231c5bacd78ca1424dcb2005bd3abe488de02bdddb818d762f4b87
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ This gem adds capistrano3 tasks for adding and removing nodes from
2
+ Amazon's Elastic Load Balancer.
3
+
4
+ ## Installation
5
+
6
+ 1. Add `cap3-elb` to your Gemfile
7
+
8
+ ```
9
+ # Gemfile
10
+ gem 'cap3-elb'
11
+ ```
12
+
13
+ 2. Use `upload` scm in Capistrano
14
+ ```
15
+ # Capfile
16
+ require 'cap3-elb'
17
+ ```
18
+
19
+ 3. Configure the name of the load balancer and your AWS credentials. I suggest
20
+ storing the credentials in something like
21
+ [dotgpg](https://github.com/ConradIrwin/dotgpg) and using environment
22
+ variables to avoid storing these keys alongside your code.
23
+
24
+ ```
25
+ # config/deploy.rb
26
+
27
+ set :load_balancer, "website"
28
+
29
+ set :aws_secret_access_key, ENV.fetch("AWS_SECRET_ACCESS_KEY")
30
+ set :aws_access_key_id, ENV.fetch("AWS_ACCESS_KEY_ID")
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ ### cap elb:status
36
+
37
+ This shows you a list of all your hosts along with their load-balancer status.
38
+
39
+ ```
40
+ bundle exec cap elb:status
41
+ ```
42
+
43
+ ### cap elb:add
44
+
45
+ The `elb:add` task adds hosts to the load balancer. By default it will add
46
+ all hosts, but you can filter things to only add one specific host using
47
+ capistrano's `--host` flag:
48
+
49
+ ```
50
+ bundle exec cap elb:add --host web1.example.com
51
+ ```
52
+
53
+ ### cap elb:remove
54
+
55
+ The `elb:remove` task removes hosts from the load balancer. It will abort
56
+ if you try and remove more than one node at a time, and also if removing
57
+ the node would result in no healthy instances.
58
+
59
+ ```
60
+ bundle exec cap elb:remove --host web1.example.com
61
+ ```
62
+
63
+ ## Meta-fu
64
+
65
+ `cap3-elb` is released under the MIT license, see LICENSE.MIT for
66
+ details. Bug reports and feature requests are welcome.
67
+
68
+
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = 'cap3-elb'
3
+ gem.version = '0.1.0'
4
+
5
+ gem.summary = 'Capistrano tasks to maintain a load balancer'
6
+ gem.description = "Provides new commands to manage your ELB load balancer from capistrano."
7
+
8
+ gem.authors = ['Conrad Irwin']
9
+ gem.email = %w(conrad@bugsnag.com)
10
+ gem.homepage = 'http://github.com/ConradIrwin/cap3-elb'
11
+
12
+ gem.license = 'MIT'
13
+
14
+ gem.add_dependency 'capistrano', '~> 3.0'
15
+
16
+ gem.files = `git ls-files`.split("\n")
17
+ end
data/lib/cap3-elb.rb ADDED
@@ -0,0 +1 @@
1
+ load File.expand_path("../tasks/elb.cap", __FILE__)
data/lib/tasks/elb.cap ADDED
@@ -0,0 +1,72 @@
1
+ require 'aws'
2
+ require 'resolv'
3
+
4
+ namespace :elb do
5
+ task :configure do
6
+ $load_balancer = AWS::ELB.new(
7
+ access_key_id: fetch(:aws_access_key_id),
8
+ secret_access_key: fetch(:aws_secret_access_key)
9
+ ).load_balancers[fetch(:load_balancer)]
10
+ end
11
+
12
+ desc "List the servers in the load balancer"
13
+ task :status => :configure do
14
+ in_balancer = $load_balancer.instances.each_with_object({}) { |i, result| result[i.ip_address] = i.elb_health }
15
+ roles(:app).each do |host|
16
+ ip = Resolv::DNS.new.getaddress(host.hostname).to_s
17
+ puts "#{host.hostname}: #{in_balancer.include?(ip) ? in_balancer[ip][:state] : "DOWN"}"
18
+ end
19
+ end
20
+
21
+ desc "Remove server from the load balancer"
22
+ task :remove => :configure do
23
+ raise "don't remove more than one machine" if roles(:app).length > 1
24
+
25
+ on roles(:app), in: :sequence do |host|
26
+ instances = $load_balancer.instances.to_a
27
+ name = host.hostname[/^[^.]*/]
28
+
29
+
30
+ to_remove = instances.detect{ |instance| instance.tags[:Name] == name }
31
+ if to_remove
32
+
33
+
34
+ to_keep = instances - [to_remove]
35
+ unless to_keep.any?{ |instance| instance.elb_health[:state] == 'InService' }
36
+ raise "Refusing to take #{host} out of rotation as there are no other machines up"
37
+ end
38
+
39
+ puts "Removing #{host.hostname} from the #{fetch(:load_balancer).inspect} load balancer"
40
+
41
+ to_remove.remove_from_load_balancer
42
+ until to_remove.elb_health[:state] == "OutOfService"
43
+ print "."
44
+ sleep 1
45
+ end
46
+ puts "\n#{host.hostname} #{to_remove.elb_health[:state]}"
47
+ else
48
+ puts "#{host.hostname} is not in the #{fetch(:load_balancer).inspect} load balancer"
49
+ end
50
+ end
51
+ end
52
+
53
+ desc "Add server to the load balancer"
54
+ task :add => :configure do
55
+ on roles(:app), in: :sequence do |host|
56
+ puts "Adding #{host.hostname} to the #{fetch(:load_balancer).inspect} load balancer."
57
+
58
+ instance = AWS::EC2.new.instances.filter('ip-address', Resolv::DNS.new.getaddress(host.hostname).to_s).first
59
+
60
+ $load_balancer.instances.register instance
61
+
62
+ puts "Waiting for #{host.hostname} to become active..."
63
+
64
+ instance = $load_balancer.instances[instance.id]
65
+ until instance.elb_health[:state] == "InService"
66
+ print "."
67
+ sleep 1
68
+ end
69
+ puts "\n#{host.hostname} #{instance.elb_health[:state]}"
70
+ end
71
+ end
72
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cap3-elb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Conrad Irwin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: capistrano
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ description: Provides new commands to manage your ELB load balancer from capistrano.
28
+ email:
29
+ - conrad@bugsnag.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - README.md
35
+ - cap-scm-upload.gemspec
36
+ - lib/cap3-elb.rb
37
+ - lib/tasks/elb.cap
38
+ homepage: http://github.com/ConradIrwin/cap3-elb
39
+ licenses:
40
+ - MIT
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.2.2
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: Capistrano tasks to maintain a load balancer
62
+ test_files: []
63
+ has_rdoc: