capify-ec2 1 → 1.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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in capify-ec2.gemspec
4
+ gemspec
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -1,18 +1,23 @@
1
- #-*- encoding: utf-8 -*-
1
+ # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
+ require "capify-ec2/version"
3
4
 
4
5
  Gem::Specification.new do |s|
5
- s.name = "capify-ec2"
6
- s.version = "1"
7
- s.authors = ["Noah Cantor"]
8
- s.email = "noah.cantor@forward.co.uk"
9
- s.homepage = "http://www.forward.co.uk"
10
- s.summary = "Grabs roles from ec2's tags and autogenerates capistrano tasks"
11
- s.platform = Gem::Platform::RUBY
12
- s.files = %w(lib).map {|d| Dir.glob("#{d}/**/*")}.flatten << "capify-ec2.gemspec"
13
- s.require_path = "lib"
14
- s.has_rdoc = false
6
+ s.name = "capify-ec2"
7
+ s.version = Capify::Ec2::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Noah Cantor", "Siddharth Dawara"]
10
+ s.email = ["noah.cantor@forward.co.uk", "siddharth.dawara@forward.co.uk"]
11
+ s.homepage = "http://github.com/forward/capify-ec2"
12
+ s.summary = %q{Grabs roles from ec2's tags and autogenerates capistrano tasks}
13
+ s.description = %q{Grabs roles from ec2's tags and autogenerates capistrano tasks}
14
+
15
+ s.rubyforge_project = "capify-ec2"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
15
21
  s.add_dependency('activesupport', '>= 3.0.0')
16
22
  s.add_dependency('fog')
17
23
  end
18
-
@@ -3,9 +3,11 @@ require 'fog'
3
3
 
4
4
  class CapifyEc2
5
5
 
6
+ attr_accessor :ec2_config, :instance, :elb_name, :elb
7
+
6
8
  def self.running_instances
7
- ec2_config = YAML.load(File.new("config/ec2.yml"))
8
- ec2 = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => ec2_config[:aws_access_key_id], :aws_secret_access_key => ec2_config[:aws_secret_access_key], :region => ec2_config[:aws_params][:region])
9
+ @ec2_config = YAML.load(File.new("config/ec2.yml"))
10
+ ec2 = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => @ec2_config[:aws_access_key_id], :aws_secret_access_key => @ec2_config[:aws_secret_access_key], :region => @ec2_config[:aws_params][:region])
9
11
  running_instances = ec2.servers.select {|instance| instance.state == "running"}
10
12
  running_instances.each do |instance|
11
13
  instance.instance_eval do
@@ -27,7 +29,7 @@ class CapifyEc2
27
29
  end
28
30
  end
29
31
 
30
- def self.get_instances_by_name(name)
32
+ def self.get_instance_by_name(name)
31
33
  selected_instances = running_instances.select do |instance|
32
34
  value = instance.case_insensitive_tag("Name")
33
35
  value == name.to_s
@@ -36,6 +38,25 @@ class CapifyEc2
36
38
 
37
39
  def self.server_names
38
40
  running_instances.map {|instance| instance.name}
39
- end
41
+ end
40
42
 
43
+ def self.get_elb_name_by_instance(instance_id)
44
+ @elb = Fog::AWS::ELB.new(:aws_access_key_id => @ec2_config[:aws_access_key_id], :aws_secret_access_key => @ec2_config[:aws_secret_access_key], :region => @ec2_config[:aws_params][:region])
45
+ @elb.load_balancers.each do |load_balancer|
46
+ load_balancer.instances.each {|instance| return load_balancer.id if instance_id == instance}
47
+ end
48
+ return nil
49
+ end
50
+
51
+ def self.deregister_instance_from_elb(instance_name)
52
+ return unless @ec2_config[:load_balanced]
53
+ @instance = get_instance_by_name(instance_name).first
54
+ @elb_name = get_elb_name_by_instance(@instance.id)
55
+ @elb.deregister_instances_from_load_balancer(@instance.id, @elb_name) unless @elb_name.nil?
56
+ end
57
+
58
+ def self.register_instance_in_elb
59
+ return unless @ec2_config[:load_balanced]
60
+ @elb.register_instances_with_load_balancer(@instance.id, @elb_name) unless @elb_name.nil?
61
+ end
41
62
  end
@@ -2,15 +2,10 @@ require File.join(File.dirname(__FILE__), '../capify-ec2')
2
2
 
3
3
  Capistrano::Configuration.instance(:must_exist).load do
4
4
  def ec2_role(role_to_define)
5
- subroles = {}
6
- if role_to_define.is_a?(Hash)
7
- defined_role = role_to_define[:name]
8
- subroles = role_to_define[:options]
9
- else
10
- defined_role = role_to_define
11
- end
5
+ defined_role = role_to_define.is_a?(Hash) ? role_to_define[:name] : role_to_define
12
6
  instances = CapifyEc2.get_instances_by_role(defined_role)
13
-
7
+ subroles = role_to_define.is_a?(Hash) ? role_to_define[:options] : {}
8
+
14
9
  instances.each do |instance|
15
10
  task instance.name.to_sym do
16
11
  set :server_address, instance.dns_name
@@ -31,16 +26,20 @@ Capistrano::Configuration.instance(:must_exist).load do
31
26
  end
32
27
  end
33
28
  end
34
-
35
- # task :add_tag do
36
- # instance_name = variables[:logger].instance_variable_get("@options")[:actions].first
37
- # CapifyEc2.add_tag(instance_name, tag, value)
38
- # end
39
29
 
40
30
  def ec2_roles(*roles)
41
31
  roles.each {|role| ec2_role(role)}
42
32
  end
43
33
 
34
+ task :deregister_instance do
35
+ servers = variables[:logger].instance_variable_get("@options")[:actions].first
36
+ CapifyEc2.deregister_instance_from_elb(servers)
37
+ end
38
+
39
+ task :register_instance do
40
+ CapifyEc2.register_instance_in_elb
41
+ end
42
+
44
43
  task :date do
45
44
  run "date"
46
45
  end
@@ -48,4 +47,9 @@ Capistrano::Configuration.instance(:must_exist).load do
48
47
  task :server_names do
49
48
  puts CapifyEc2.server_names.sort
50
49
  end
50
+
51
+ namespace :deploy do
52
+ before "deploy", "deregister_instance"
53
+ after "deploy", "register_instance"
54
+ end
51
55
  end
@@ -0,0 +1,5 @@
1
+ module Capify
2
+ module Ec2
3
+ VERSION = "1.1.0"
4
+ end
5
+ end
@@ -0,0 +1,100 @@
1
+ Capify Ec2
2
+ ====================================================
3
+
4
+ capify-ec2 is used to generate capistrano namespaces using ec2 tags.
5
+
6
+ eg: If you have three servers on amazon's ec2.
7
+
8
+ server-1 Tag: Role => "web"
9
+ server-2 Tag: Role => "db"
10
+ server-3 Tag: Role => "web"
11
+
12
+ Installing
13
+
14
+ gem install capify-ec2
15
+
16
+ In your deploy.rb:
17
+
18
+ require "capify-ec2/capistrano"
19
+ ec2_roles :web
20
+
21
+ Will generate
22
+
23
+ task :server-1 do
24
+ role :web, {server-1 public dns fetched from Amazon}
25
+ end
26
+
27
+ task :server-3 do
28
+ role :web, {server-1 public dns fetched from Amazon}
29
+ end
30
+
31
+ task :web do
32
+ role :web, {server-1 public dns fetched from Amazon}
33
+ role :web, {server-3 public dns fetched from Amazon}
34
+ end
35
+
36
+ Additionally
37
+
38
+ require "capify-ec2/capistrano"
39
+ ec2_roles :db
40
+
41
+ Will generate
42
+
43
+ task :server-2 do
44
+ role :web, {server-2 public dns fetched from Amazon}
45
+ end
46
+
47
+ task :db do
48
+ role :db, {server-2 public dns fetched from Amazon}
49
+ end
50
+
51
+ Running
52
+
53
+ cap web date
54
+
55
+ will run the date command on all server's tagged with the web role
56
+
57
+ More options
58
+ ====================================================
59
+
60
+ ec2_roles {:name=>"web", :options=>{:cron=>"server-1"}}
61
+
62
+ Will generate
63
+
64
+ task :server-1 do
65
+ role :web, {server-1 public dns fetched from Amazon}, :cron=>true
66
+ end
67
+
68
+ task :server-3 do
69
+ role :web, {server-1 public dns fetched from Amazon}
70
+ end
71
+
72
+ task :web do
73
+ role :web, {server-1 public dns fetched from Amazon}, :cron=>true
74
+ role :web, {server-3 public dns fetched from Amazon}
75
+ end
76
+
77
+ Which is cool if you want a task like this in deploy.rb
78
+
79
+ task :update_cron => :web, :only=>{:cron} do
80
+ Do something to a server with cron on it
81
+ end
82
+
83
+ Ec2 config
84
+ ====================================================
85
+
86
+ This gem requires 'config/ec2.yml' in your project.
87
+ The yml file needs to look something like this:
88
+
89
+ :aws_access_key_id: "YOUR ACCESS KEY"
90
+ :aws_secret_access_key: "YOUR SECRET"
91
+ :aws_params:
92
+ :region: 'eu-west-1'
93
+ :load_balanced: true
94
+
95
+ The :aws_params are optional.
96
+ If :load_balanced is set to true, the gem will deregister
97
+ the instance from the load balancer before deploying and
98
+ reregister it after, using before and after deploy hooks.
99
+ :load_balanced only works for individual instances, not
100
+ for roles.
metadata CHANGED
@@ -1,19 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capify-ec2
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- version: "1"
8
+ - 1
9
+ - 0
10
+ version: 1.1.0
9
11
  platform: ruby
10
12
  authors:
11
13
  - Noah Cantor
14
+ - Siddharth Dawara
12
15
  autorequire:
13
16
  bindir: bin
14
17
  cert_chain: []
15
18
 
16
- date: 2011-05-11 00:00:00 Z
19
+ date: 2011-05-20 00:00:00 +01:00
20
+ default_executable:
17
21
  dependencies:
18
22
  - !ruby/object:Gem::Dependency
19
23
  name: activesupport
@@ -45,8 +49,10 @@ dependencies:
45
49
  version: "0"
46
50
  type: :runtime
47
51
  version_requirements: *id002
48
- description:
49
- email: noah.cantor@forward.co.uk
52
+ description: Grabs roles from ec2's tags and autogenerates capistrano tasks
53
+ email:
54
+ - noah.cantor@forward.co.uk
55
+ - siddharth.dawara@forward.co.uk
50
56
  executables: []
51
57
 
52
58
  extensions: []
@@ -54,10 +60,16 @@ extensions: []
54
60
  extra_rdoc_files: []
55
61
 
56
62
  files:
57
- - lib/capify-ec2/capistrano.rb
58
- - lib/capify-ec2.rb
63
+ - .gitignore
64
+ - Gemfile
65
+ - Rakefile
59
66
  - capify-ec2.gemspec
60
- homepage: http://www.forward.co.uk
67
+ - lib/capify-ec2.rb
68
+ - lib/capify-ec2/capistrano.rb
69
+ - lib/capify-ec2/version.rb
70
+ - readme.md
71
+ has_rdoc: true
72
+ homepage: http://github.com/forward/capify-ec2
61
73
  licenses: []
62
74
 
63
75
  post_install_message:
@@ -85,8 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
97
  version: "0"
86
98
  requirements: []
87
99
 
88
- rubyforge_project:
89
- rubygems_version: 1.7.2
100
+ rubyforge_project: capify-ec2
101
+ rubygems_version: 1.6.2
90
102
  signing_key:
91
103
  specification_version: 3
92
104
  summary: Grabs roles from ec2's tags and autogenerates capistrano tasks