capify-ec2 1

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,18 @@
1
+ #-*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ 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
15
+ s.add_dependency('activesupport', '>= 3.0.0')
16
+ s.add_dependency('fog')
17
+ end
18
+
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ require 'fog'
3
+
4
+ class CapifyEc2
5
+
6
+ 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
+ running_instances = ec2.servers.select {|instance| instance.state == "running"}
10
+ running_instances.each do |instance|
11
+ instance.instance_eval do
12
+ def case_insensitive_tag(key)
13
+ tags[key] || tags[key.downcase]
14
+ end
15
+
16
+ def name
17
+ case_insensitive_tag("Name").split('-').reject {|portion| portion.include?(".")}.join("-")
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def self.get_instances_by_role(role)
24
+ selected_instances = running_instances.select do |instance|
25
+ value = instance.case_insensitive_tag("Role")
26
+ value == role.to_s
27
+ end
28
+ end
29
+
30
+ def self.get_instances_by_name(name)
31
+ selected_instances = running_instances.select do |instance|
32
+ value = instance.case_insensitive_tag("Name")
33
+ value == name.to_s
34
+ end
35
+ end
36
+
37
+ def self.server_names
38
+ running_instances.map {|instance| instance.name}
39
+ end
40
+
41
+ end
@@ -0,0 +1,51 @@
1
+ require File.join(File.dirname(__FILE__), '../capify-ec2')
2
+
3
+ Capistrano::Configuration.instance(:must_exist).load do
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
12
+ instances = CapifyEc2.get_instances_by_role(defined_role)
13
+
14
+ instances.each do |instance|
15
+ task instance.name.to_sym do
16
+ set :server_address, instance.dns_name
17
+ role :web, *server_address
18
+ role :app, *server_address
19
+ end
20
+ end
21
+
22
+ task defined_role.to_sym do
23
+ instances.each do |instance|
24
+ new_options = {}
25
+ subroles.each {|key, value| new_options[key] = true if value.to_s == instance.name}
26
+ if new_options
27
+ role defined_role.to_sym, instance.dns_name, new_options
28
+ else
29
+ role defined_role.to_sym, instance.dns_name
30
+ end
31
+ end
32
+ end
33
+ 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
+
40
+ def ec2_roles(*roles)
41
+ roles.each {|role| ec2_role(role)}
42
+ end
43
+
44
+ task :date do
45
+ run "date"
46
+ end
47
+
48
+ task :server_names do
49
+ puts CapifyEc2.server_names.sort
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capify-ec2
3
+ version: !ruby/object:Gem::Version
4
+ hash: 1
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ version: "1"
9
+ platform: ruby
10
+ authors:
11
+ - Noah Cantor
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2011-05-11 00:00:00 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: activesupport
20
+ prerelease: false
21
+ requirement: &id001 !ruby/object:Gem::Requirement
22
+ none: false
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ hash: 7
27
+ segments:
28
+ - 3
29
+ - 0
30
+ - 0
31
+ version: 3.0.0
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: fog
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ description:
49
+ email: noah.cantor@forward.co.uk
50
+ executables: []
51
+
52
+ extensions: []
53
+
54
+ extra_rdoc_files: []
55
+
56
+ files:
57
+ - lib/capify-ec2/capistrano.rb
58
+ - lib/capify-ec2.rb
59
+ - capify-ec2.gemspec
60
+ homepage: http://www.forward.co.uk
61
+ licenses: []
62
+
63
+ post_install_message:
64
+ rdoc_options: []
65
+
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ hash: 3
83
+ segments:
84
+ - 0
85
+ version: "0"
86
+ requirements: []
87
+
88
+ rubyforge_project:
89
+ rubygems_version: 1.7.2
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: Grabs roles from ec2's tags and autogenerates capistrano tasks
93
+ test_files: []
94
+