capistrano-elb 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,80 @@
1
+ require 'fog'
2
+ require 'yaml'
3
+ require 'capistrano'
4
+ require 'pp'
5
+ # require "dir"
6
+
7
+ class CapELB
8
+ def initialize(configdir=File.join(Dir.pwd, 'config'))
9
+ ec2credentials = YAML::load(File.open(File.join(configdir, 'ec2credentials.yaml')))
10
+ aws = Fog::Compute.new(ec2credentials.merge({:provider=>'AWS'}))
11
+ @regions = aws.describe_regions.body["regionInfo"].map {|region| region["regionName"]}
12
+
13
+ @compute = {}
14
+ @regions.each do |region|
15
+ @compute.merge!(region => Fog::Compute.new(ec2credentials.merge({:provider=>'AWS',:region=>region})))
16
+ end
17
+
18
+ @elb = {}
19
+ @regions.each do |region|
20
+ @elb.merge!(region => Fog::AWS::ELB.new(ec2credentials.merge(:region=>region)))
21
+ end
22
+
23
+ @lbsfile = File.join(configdir, 'lbs.yaml')
24
+
25
+ @lbs = load_config
26
+ end
27
+
28
+ def config_from_aws
29
+ lbs = {}
30
+ @regions.each do |region|
31
+ loadBalancerDescriptions =
32
+ @elb[region].describe_load_balancers.body["DescribeLoadBalancersResult"]["LoadBalancerDescriptions"]
33
+ loadBalancerDescriptions.each do |lb|
34
+ lbs.merge!({region => {lb["LoadBalancerName"] => lb["Instances"]}})
35
+ end
36
+ end
37
+ lbs
38
+ end
39
+
40
+ def save_config
41
+ File.open( @lbsfile, 'w' ) do |file|
42
+ YAML.dump( config_from_aws, file )
43
+ end
44
+ end
45
+
46
+ def load_config
47
+ unless File.exists? @lbsfile
48
+ save_config
49
+ end
50
+ YAML::load(File.open(@lbsfile))
51
+ end
52
+
53
+ def check_config
54
+ load_config == config_from_aws
55
+ end
56
+
57
+ def add(serverlist)
58
+ each_server_by_lbs(serverlist) do |region, lbname, servers|
59
+ region.register_instances_with_load_balancer(servers, lbname)
60
+ end
61
+ end
62
+
63
+ def remove(serverlist)
64
+ each_server_by_lbs(serverlist) do |region, lbname, servers|
65
+ region.deregister_instances_from_load_balancer(servers, lbname)
66
+ end
67
+ end
68
+
69
+ def each_server_by_lbs(serverlist)
70
+ @lbs.each_pair do |region, lbs|
71
+ lbs.each_pair do |lbname, target_instances|
72
+ to_change = @compute[region].servers.select{|server| serverlist.include? server.dns_name}.map{|server| server.id}
73
+ yield(@elb[region], lbname, to_change) unless to_change.empty?
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+
@@ -0,0 +1,30 @@
1
+ require "capistrano-elb"
2
+ require "pp"
3
+
4
+ Capistrano::Configuration.instance(:must_exist).load do
5
+ namespace :elb do
6
+ capELB = CapELB.new()
7
+
8
+ task :remove do
9
+ servers = roles[:web].servers.map {|server| server.host}
10
+ pp servers
11
+ capELB.remove servers
12
+ end
13
+
14
+ task :add do
15
+ servers = roles[:web].servers.map {|server| server.host}
16
+ capELB.add servers
17
+ end
18
+
19
+ task :save do
20
+ capELB.save_config
21
+ end
22
+
23
+ task :check do
24
+ puts capELB.check_config
25
+ end
26
+ end
27
+
28
+ before "deploy", "elb:remove"
29
+ after "deploy", "elb:add"
30
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capistrano-elb
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
+ prerelease: !!null
6
+ platform: ruby
7
+ authors:
8
+ - thattommyhall
9
+ autorequire: !!null
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-04-11 00:00:00.000000000 +01:00
13
+ default_executable: !!null
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: fog
17
+ requirement: &2156032200 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2156032200
26
+ - !ruby/object:Gem::Dependency
27
+ name: excon
28
+ requirement: &2156031720 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *2156031720
37
+ description: Remove servers automagically from ELB before deploy
38
+ email: tom.hall@forward.co.uk
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - lib/capistrano-elb.rb
44
+ - lib/capistrano-elb/tasks.rb
45
+ has_rdoc: true
46
+ homepage: https://github.com/thattommyhall/capistrano-elb
47
+ licenses: []
48
+ post_install_message: !!null
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project: !!null
66
+ rubygems_version: 1.5.0
67
+ signing_key: !!null
68
+ specification_version: 3
69
+ summary: Automagically remove/readd servers from EC2 load balancers as you cap deploy
70
+ test_files: []