capawsext 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README +5 -0
- data/capawsext.gemspec +23 -0
- data/lib/capawsext.rb +2 -0
- data/lib/capawsext/tasks.rb +46 -0
- data/lib/capawsext/version.rb +3 -0
- data/lib/capawsext/whoec2helper.rb +201 -0
- metadata +91 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 762e84774e300c85a73a55b0c6aea0c31fcad919
|
4
|
+
data.tar.gz: 148f79e31294a8ad2d0fae088761a8aa6614ab3e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b694827848eae4a164ce673874358f4b2c4eef31c35ad50bb2532f0ec76b6c81153e4570a632696d1c545765332f29f7c6f8a6b967ceb5a0790d7a82ed175956
|
7
|
+
data.tar.gz: 859bfeccca344579b30fd280f7603c3e1d576c793829dfde0a5b9498621cde1b24c7c9309ff3fe6aca56ad213083e32095baab9d021aa3c7d284c49c9312c70d
|
data/README
ADDED
data/capawsext.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "capawsext/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "capawsext"
|
7
|
+
s.version = CapAwsExt::VERSION
|
8
|
+
s.authors = ["Sumit vij"]
|
9
|
+
s.email = ["sumit@whodini.com"]
|
10
|
+
s.homepage = "http://github.com/thedebugger/capawsext"
|
11
|
+
s.summary = %q{Import the server ips, roles, groups from AWS server tags}
|
12
|
+
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
|
20
|
+
s.add_dependency "capistrano", "~> 2.0"
|
21
|
+
s.add_dependency "fog"
|
22
|
+
s.add_dependency "colored"
|
23
|
+
end
|
data/lib/capawsext.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
4
|
+
abort "cap_git_tools requires Capistrano 2"
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'capawsext/whoec2helper'
|
8
|
+
|
9
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
10
|
+
def add_groups
|
11
|
+
ec2_helper = Ec2Helper.new
|
12
|
+
groups = ec2_helper.get_groups
|
13
|
+
groups.each { |group|
|
14
|
+
task group.to_sym, :desc => "Run the task in all instances of the #{group}" do
|
15
|
+
instances = ec2_helper.get_instances(group)
|
16
|
+
#Initialize the global variables
|
17
|
+
sec_groups = Set.new
|
18
|
+
instances.each {|instance|
|
19
|
+
instance.groups.each { |sec_group|
|
20
|
+
sec_groups << sec_group
|
21
|
+
}
|
22
|
+
|
23
|
+
roles = Array.new
|
24
|
+
instance.tags['role'].split(',').each {|role|
|
25
|
+
roles << role.to_sym
|
26
|
+
}
|
27
|
+
server instance.dns_name, *roles
|
28
|
+
}
|
29
|
+
init_group_global_variables(group,sec_groups)
|
30
|
+
end
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def init_group_global_variables(group, sec_groups)
|
35
|
+
if sec_groups.count != 1
|
36
|
+
raise "#{sec_groups} security defined in this group"
|
37
|
+
end
|
38
|
+
set :security_group, sec_groups.to_a[0]
|
39
|
+
set :group, group
|
40
|
+
#Load the file is exists
|
41
|
+
load "config/#{group}" if File.exists?(File.expand_path(Dir.pwd + "/config/#{group}.rb"))
|
42
|
+
#TODO: call the group name configuration file to load group configuration.
|
43
|
+
#Like the capmultiext
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'fog'
|
3
|
+
require 'colored'
|
4
|
+
#require File.expand_path(File.dirname(__FILE__) + '/capify-cloud/server')
|
5
|
+
|
6
|
+
class Ec2Helper
|
7
|
+
|
8
|
+
def initialize(cloud_config = "config/cloud.yml")
|
9
|
+
@cloud_config = YAML.load_file cloud_config
|
10
|
+
@instances =[]
|
11
|
+
@cloud_providers = @cloud_config[:cloud_providers]
|
12
|
+
@cloud_providers.each do |cloud_provider|
|
13
|
+
config = @cloud_config[cloud_provider.to_sym]
|
14
|
+
config[:provider] = cloud_provider
|
15
|
+
regions = determine_regions(cloud_provider)
|
16
|
+
config.delete(:regions)
|
17
|
+
if regions
|
18
|
+
regions.each do |region|
|
19
|
+
config.delete(:region)
|
20
|
+
config[:region] = region
|
21
|
+
populate_instances(config)
|
22
|
+
end
|
23
|
+
else populate_instances(config)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
def determine_regions(cloud_provider = 'AWS')
|
29
|
+
regions = @cloud_config[cloud_provider.to_sym][:regions]
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def populate_instances(config)
|
34
|
+
@fog = Fog::Compute.new(config)
|
35
|
+
@fog.servers.each {|server| @instances << server }
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_zoo_srvs_private_dns(group)
|
39
|
+
zoosrvs = Array.new
|
40
|
+
instances = get_instances_byrole(group, 'zoo-srv')
|
41
|
+
instances.each {|instance|
|
42
|
+
zoosrvs << instance.private_dns_name
|
43
|
+
}
|
44
|
+
return zoosrvs
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_instances_byrole(group, role)
|
48
|
+
ret_instances = Array.new
|
49
|
+
@instances.each {|instance|
|
50
|
+
if not instance.tags['role'].nil? and instance.ready?
|
51
|
+
unless instance.tags['role'].match(role).nil? or instance.tags['group'] != group
|
52
|
+
ret_instances << instance
|
53
|
+
end
|
54
|
+
end
|
55
|
+
}
|
56
|
+
return ret_instances
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_solr_private_dns(group)
|
60
|
+
instances = get_instances_byrole(group, 'solr')
|
61
|
+
return instances[0].private_dns_name if instances.count > 0
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def get_facade_srv_public_dns(group)
|
66
|
+
instance = get_instances_byrole(group, 'api-srv')
|
67
|
+
return instance[0].dns_name if instance.count > 0
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_db_srv_private_dns(group)
|
71
|
+
instance = get_instances_byrole(group, 'db-srv')
|
72
|
+
return instance[0].private_dns_name if instance.count > 0
|
73
|
+
end
|
74
|
+
|
75
|
+
def printInstanceDetails()
|
76
|
+
@instances.each_with_index do |instance, i|
|
77
|
+
puts sprintf "%02d: %-20s %-20s %-20s %-20s %-25s %-20s (%s) (%s) (%s)",
|
78
|
+
i, (instance.tags["Name"] || "").green,instance.private_dns_name ,instance.id.red, instance.flavor_id.cyan,
|
79
|
+
instance.dns_name.blue, instance.availability_zone.magenta, (instance.tags["role"] || "").yellow,
|
80
|
+
(instance.tags["group"] || "").yellow, (instance.tags["app"] || "").green if instance.ready?
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_server_details_by_pri_pub_dns(dns)
|
86
|
+
details={}
|
87
|
+
@instances.each { |instance|
|
88
|
+
if instance.private_dns_name == dns or instance.dns_name == dns
|
89
|
+
details['name']=instance.tags['name_s']
|
90
|
+
details['orgid']=instance.tags['orgid']
|
91
|
+
details['group']=instance.tags['group']
|
92
|
+
details['private_dns_name'] = instance.private_dns_name
|
93
|
+
details['role'] = instance.tags['role']
|
94
|
+
details['public_dns_name'] = instance.dns_name
|
95
|
+
details['id'] = instance.id
|
96
|
+
details['zone'] = instance.availability_zone
|
97
|
+
return details
|
98
|
+
end
|
99
|
+
}
|
100
|
+
return details
|
101
|
+
end
|
102
|
+
|
103
|
+
def get_server_details_map(isrunning)
|
104
|
+
servers={}
|
105
|
+
@instances.each { |instance|
|
106
|
+
if not isrunning or (isrunning and instance.ready?)
|
107
|
+
details={}
|
108
|
+
details['name']=instance.tags['name_s']
|
109
|
+
details['orgid']=instance.tags['orgid']
|
110
|
+
details['group']=instance.tags['group']
|
111
|
+
details['private_dns_name'] = instance.private_dns_name
|
112
|
+
details['role'] = instance.tags['role']
|
113
|
+
details['public_dns_name'] = instance.dns_name
|
114
|
+
details['id'] = instance.id
|
115
|
+
details['zone'] = instance.availability_zone
|
116
|
+
details['device_mappings'] = Array.new
|
117
|
+
instance.block_device_mapping.each { |mapping|
|
118
|
+
details['device_mappings'] << mapping['deviceName']
|
119
|
+
}
|
120
|
+
servers[instance.private_dns_name] = details
|
121
|
+
end
|
122
|
+
}
|
123
|
+
return servers
|
124
|
+
end
|
125
|
+
|
126
|
+
def get_all_stacks
|
127
|
+
stacks = {}
|
128
|
+
@instances.each {|instance|
|
129
|
+
instances = stacks[instance.tags['group']]
|
130
|
+
if instances.nil?
|
131
|
+
instances = Array.new
|
132
|
+
stacks[instance.tags['group']] = instances
|
133
|
+
end
|
134
|
+
instances << instance
|
135
|
+
}
|
136
|
+
return stacks
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
def get_instance_on_dns(dns)
|
141
|
+
@instances.each { |instance|
|
142
|
+
if instance.private_dns_name == dns or instance.dns_name == dns
|
143
|
+
return instance
|
144
|
+
end
|
145
|
+
}
|
146
|
+
end
|
147
|
+
|
148
|
+
def get_groups
|
149
|
+
groups = Set.new
|
150
|
+
@instances.each { |instance|
|
151
|
+
group = instance.tags['group']
|
152
|
+
groups.add(group) if not group.nil?
|
153
|
+
}
|
154
|
+
return groups
|
155
|
+
end
|
156
|
+
|
157
|
+
def get_instances(group)
|
158
|
+
ret_instances = Array.new
|
159
|
+
@instances.each { |instance|
|
160
|
+
ret_instances << instance if instance.tags['group'] == group and instance.ready?
|
161
|
+
}
|
162
|
+
return ret_instances
|
163
|
+
end
|
164
|
+
|
165
|
+
def get_instance_by_name(name)
|
166
|
+
@instances.each {|instance|
|
167
|
+
return instance if (instance.tags['name_s'] || "").casecmp(name) == 0
|
168
|
+
return instance if (instance.tags['Name'] || "").casecmp(name) == 0
|
169
|
+
}
|
170
|
+
return nil
|
171
|
+
end
|
172
|
+
|
173
|
+
def get_zone(roles, sec_group)
|
174
|
+
zones = Hash["us-west-1b" =>0,"us-west-1c" =>0]
|
175
|
+
@instances.each { |instance|
|
176
|
+
if instance.tags['role'] == roles and instance.security_group_ids.include?(sec_group)
|
177
|
+
zones[instance.availability_zone] = zones[instance.availability_zone] + 1
|
178
|
+
end
|
179
|
+
}
|
180
|
+
min_zone = "us-west-1b"
|
181
|
+
zones.keys.each{|key|
|
182
|
+
if zones[min_zone] > zones[key]
|
183
|
+
min_zone = key
|
184
|
+
end
|
185
|
+
}
|
186
|
+
return min_zone
|
187
|
+
end
|
188
|
+
|
189
|
+
|
190
|
+
def add_tags(resource_id, tags = {})
|
191
|
+
tags.each { |key, value|
|
192
|
+
puts "#{resource_id}, #{key}, #{value}"
|
193
|
+
@fog.tags.create(:resource_id => resource_id, :key => key, :value => value)
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
def get_all_instances
|
198
|
+
return @instances
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capawsext
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sumit vij
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-19 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: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: fog
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: colored
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description:
|
56
|
+
email:
|
57
|
+
- sumit@whodini.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- README
|
63
|
+
- capawsext.gemspec
|
64
|
+
- lib/capawsext.rb
|
65
|
+
- lib/capawsext/tasks.rb
|
66
|
+
- lib/capawsext/version.rb
|
67
|
+
- lib/capawsext/whoec2helper.rb
|
68
|
+
homepage: http://github.com/thedebugger/capawsext
|
69
|
+
licenses: []
|
70
|
+
metadata: {}
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 2.0.0.rc.2
|
88
|
+
signing_key:
|
89
|
+
specification_version: 4
|
90
|
+
summary: Import the server ips, roles, groups from AWS server tags
|
91
|
+
test_files: []
|