capistrano-elobuff 0.1.4 → 0.2.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.
- data/elobuff_capistrano.gemspec +1 -1
- data/lib/capistrano/elobuff/ec2.rb +15 -0
- data/lib/capistrano/elobuff/ec2/compute.rb +63 -0
- data/lib/capistrano/elobuff/ec2/helpers.rb +16 -0
- data/lib/capistrano/elobuff/ec2/recipes/a.rb +12 -0
- data/lib/capistrano/elobuff/ec2/recipes/r.rb +30 -0
- data/lib/capistrano/elobuff/ec2/recipes/s.rb +83 -0
- data/lib/capistrano/elobuff/ec2/recipes/z.rb +30 -0
- data/lib/capistrano/elobuff/ec2/server.rb +62 -0
- metadata +10 -2
data/elobuff_capistrano.gemspec
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "fog"
|
2
|
+
require "capistrano/elobuff/ec2/helpers"
|
3
|
+
require "capistrano/elobuff/ec2/compute"
|
4
|
+
require "capistrano/elobuff/ec2/server"
|
5
|
+
|
6
|
+
Capistrano::Configuration.instance.load do
|
7
|
+
require_settings :ec2_ami, :ec2_instance_type, :ec2_security_group, :ec2_availability_zone
|
8
|
+
|
9
|
+
set_default(:ec2_key) { ENV["AWS_EC2_KEY"] || ENV["AWS_S3_KEY"] || raise("Please specify an AWS_EC2_KEY") }
|
10
|
+
set_default(:ec2_secret) { ENV["AWS_EC2_SECRET"] || ENV["AWS_S3_SECRET"] || raise("Please specify an AWS_EC2_SECRET") }
|
11
|
+
|
12
|
+
set_default(:ec2) { Capistrano::Elobuff::Ec2::Compute.new application, ec2_key, ec2_secret }
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir.glob(File.join(File.dirname(__FILE__), "/ec2/recipes/*.rb")).sort.each {|f| load f }
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "fog"
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
module Elobuff
|
5
|
+
module Ec2
|
6
|
+
class Compute
|
7
|
+
def initialize(application, access_key_id, secret_access_key)
|
8
|
+
@application = application
|
9
|
+
@access_key_id = access_key_id
|
10
|
+
@secret_access_key = secret_access_key
|
11
|
+
end
|
12
|
+
|
13
|
+
def connection
|
14
|
+
@connection ||= Fog::Compute.new provider: "AWS", aws_access_key_id: @access_key_id, aws_secret_access_key: @secret_access_key
|
15
|
+
end
|
16
|
+
|
17
|
+
def servers
|
18
|
+
@servers ||= connection.servers.select {|s| s.tags.keys.include? @application.to_s }.map {|s| Server.new s, @application }
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_server(id)
|
22
|
+
servers.select {|s| (s.id == id) || (s.name == id) || (s.address == id) }.first || die("Could not find server with id, name or address: #{id}")
|
23
|
+
end
|
24
|
+
|
25
|
+
def available_servers
|
26
|
+
servers.select {|s| s.available? }
|
27
|
+
end
|
28
|
+
|
29
|
+
def roles
|
30
|
+
available_servers.map {|s| s.roles }.flatten.uniq
|
31
|
+
end
|
32
|
+
|
33
|
+
def zones
|
34
|
+
available_servers.map {|s| s.zone }.flatten.uniq
|
35
|
+
end
|
36
|
+
|
37
|
+
def available_servers_in_role(role)
|
38
|
+
available_servers.select {|s| s.roles.include? role }
|
39
|
+
end
|
40
|
+
|
41
|
+
def available_servers_in_zone(zone)
|
42
|
+
available_servers.select {|s| s.zone == zone }
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_server(ami, type, security_groups, availability_zone, name, roles)
|
46
|
+
puts "Creating server"
|
47
|
+
server = connection.servers.create(
|
48
|
+
image_id: ami,
|
49
|
+
flavor_id: type,
|
50
|
+
groups: security_groups,
|
51
|
+
availability_zone: availability_zone,
|
52
|
+
tags: { "Name" => name, "#{@application}" => roles })
|
53
|
+
server.wait_for { ready? }
|
54
|
+
Server.new(server, @application)
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_server_tags(server)
|
58
|
+
connection.create_tags server.id, server.tags
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
def die(why)
|
2
|
+
$stdout.sync = true
|
3
|
+
puts ""
|
4
|
+
puts " FATAL ERROR: #{why}"
|
5
|
+
exit 1
|
6
|
+
end
|
7
|
+
|
8
|
+
def find_servers
|
9
|
+
if ids = ENV["SERVERS"]
|
10
|
+
ids.split(",").map {|id| ec2.find_server id }
|
11
|
+
elsif id = ENV["SERVER"]
|
12
|
+
Array(ec2.find_server id)
|
13
|
+
else
|
14
|
+
die "Please specify SERVER or SERVERS"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
require_settings :ec2
|
3
|
+
|
4
|
+
namespace :r do
|
5
|
+
desc "List roles"
|
6
|
+
task :default do
|
7
|
+
puts "Listing roles:"
|
8
|
+
ec2.roles.each do |r|
|
9
|
+
puts "%-16s %s" % ["#{r}:", ec2.available_servers_in_role(r).map(&:id).join(", ")]
|
10
|
+
end
|
11
|
+
puts ""
|
12
|
+
puts "Commands: #{ec2.roles.map {|r| "r:#{r}" }.join(", ")}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
18
|
+
def ec2_roles
|
19
|
+
namespace :r do
|
20
|
+
ec2.roles.each do |r|
|
21
|
+
desc "Invoke Role: #{r}"
|
22
|
+
task r do
|
23
|
+
ec2.available_servers_in_role(r).each do |s|
|
24
|
+
server s.address, *s.roles
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
require_settings :ec2
|
3
|
+
|
4
|
+
namespace :s do
|
5
|
+
desc "List servers"
|
6
|
+
task :default do
|
7
|
+
puts "Listing servers:"
|
8
|
+
puts ec2.servers.map(&:to_s)
|
9
|
+
puts ""
|
10
|
+
puts "SERVERS: #{ec2.available_servers.map(&:id).join(", ")}"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Add Server"
|
14
|
+
task :add do
|
15
|
+
ami = ENV["EC2_AMI"] || ec2_ami || die("Please specify an EC2_AMI")
|
16
|
+
type = ENV["EC2_INSTANCE_TYPE"] || ec2_instance_type || die("Please specify an EC2_INSTANCE_TYPE")
|
17
|
+
group = ENV["EC2_SECURITY_GROUP"] || ec2_security_group || die("Please specify an EC2_SECURITY_GROUP")
|
18
|
+
zone = ENV["EC2_AVAILABILITY_ZONE"] || ec2_availability_zone || die("Please specify an EC2_AVAILABILITY_ZONE")
|
19
|
+
name = ENV["NAME"] || die("Please specify a NAME")
|
20
|
+
roles = ENV["ROLES"] || die("Please specify ROLES")
|
21
|
+
|
22
|
+
s = ec2.create_server(ami, type, group, zone, name, roles)
|
23
|
+
server s.address, *s.roles
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Update Server Roles"
|
27
|
+
task :rerole do
|
28
|
+
find_servers.each do |s|
|
29
|
+
if roles = ENV["ROLES"]
|
30
|
+
s.roles = roles
|
31
|
+
ec2.update_server_tags s
|
32
|
+
end
|
33
|
+
|
34
|
+
puts s.to_s
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Rename Servers"
|
39
|
+
task :rename do
|
40
|
+
find_servers.each do |s|
|
41
|
+
if name = ENV["NAME"]
|
42
|
+
s.name = name
|
43
|
+
ec2.update_server_tags s
|
44
|
+
end
|
45
|
+
|
46
|
+
puts s.to_s
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "Console into Server"
|
51
|
+
task :console do
|
52
|
+
s = find_servers.first
|
53
|
+
exec "ssh #{user}@#{s.address}"
|
54
|
+
end
|
55
|
+
|
56
|
+
desc "Terminate Servers"
|
57
|
+
task :terminate do
|
58
|
+
puts "Preparing to terminate the following servers:"
|
59
|
+
find_servers.each do |s|
|
60
|
+
puts s.to_s
|
61
|
+
end
|
62
|
+
|
63
|
+
ENV["CONFIRM"] || die("Please set CONFIRM in order to terminate")
|
64
|
+
|
65
|
+
find_servers.each do |s|
|
66
|
+
s.terminate!
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
73
|
+
def ec2_servers
|
74
|
+
namespace :s do
|
75
|
+
ec2.servers.each do |s|
|
76
|
+
desc "Invoke Server: #{s.id}"
|
77
|
+
task s.slug do
|
78
|
+
define_server s.address, *s.roles
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
require_settings :ec2
|
3
|
+
|
4
|
+
namespace :z do
|
5
|
+
desc "List zones"
|
6
|
+
task :default do
|
7
|
+
puts "Listing availability zones:"
|
8
|
+
ec2.zones.each do |z|
|
9
|
+
puts "%-16s %s" % ["#{z}:", ec2.available_servers_in_zone(z).map(&:id).join(", ")]
|
10
|
+
end
|
11
|
+
puts ""
|
12
|
+
puts "Commands: #{ec2.zones.map {|z| "z:#{z}" }.join(", ")}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
18
|
+
def ec2_zones
|
19
|
+
namespace :z do
|
20
|
+
ec2.zones.each do |z|
|
21
|
+
desc "Invoke Zone: #{z}"
|
22
|
+
task z do
|
23
|
+
ec2.available_servers_in_zone(z).each do |s|
|
24
|
+
server s.address, *s.roles
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "fog"
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
module Elobuff
|
5
|
+
module Ec2
|
6
|
+
class Server
|
7
|
+
def initialize(fog_server, application)
|
8
|
+
@server = fog_server
|
9
|
+
@application = application
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
"%-24s%-16s%-48s%-16s%-16s%-16s%-24s%s" % [name, id, address, @server.image_id, @server.availability_zone, @server.state, @server.groups.join(","), roles.join(",")]
|
14
|
+
end
|
15
|
+
|
16
|
+
def available?
|
17
|
+
@server.state == "running"
|
18
|
+
end
|
19
|
+
|
20
|
+
def id
|
21
|
+
@server.id
|
22
|
+
end
|
23
|
+
|
24
|
+
def slug
|
25
|
+
@server.id.gsub(/i-/, "")
|
26
|
+
end
|
27
|
+
|
28
|
+
def name
|
29
|
+
@server.tags["Name"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def name=(string)
|
33
|
+
@server.tags["Name"] = string
|
34
|
+
end
|
35
|
+
|
36
|
+
def address
|
37
|
+
@server.dns_name
|
38
|
+
end
|
39
|
+
|
40
|
+
def tags
|
41
|
+
@server.tags
|
42
|
+
end
|
43
|
+
|
44
|
+
def zone
|
45
|
+
@server.availability_zone
|
46
|
+
end
|
47
|
+
|
48
|
+
def roles
|
49
|
+
@server.tags[@application].split(",").map(&:to_sym)
|
50
|
+
end
|
51
|
+
|
52
|
+
def roles=(string)
|
53
|
+
@server.tags[@application] = string
|
54
|
+
end
|
55
|
+
|
56
|
+
def terminate!
|
57
|
+
@server.destroy
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-elobuff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
@@ -43,6 +43,14 @@ files:
|
|
43
43
|
- lib/capistrano/elobuff.rb
|
44
44
|
- lib/capistrano/elobuff/base.rb
|
45
45
|
- lib/capistrano/elobuff/defaults.rb
|
46
|
+
- lib/capistrano/elobuff/ec2.rb
|
47
|
+
- lib/capistrano/elobuff/ec2/compute.rb
|
48
|
+
- lib/capistrano/elobuff/ec2/helpers.rb
|
49
|
+
- lib/capistrano/elobuff/ec2/recipes/a.rb
|
50
|
+
- lib/capistrano/elobuff/ec2/recipes/r.rb
|
51
|
+
- lib/capistrano/elobuff/ec2/recipes/s.rb
|
52
|
+
- lib/capistrano/elobuff/ec2/recipes/z.rb
|
53
|
+
- lib/capistrano/elobuff/ec2/server.rb
|
46
54
|
- lib/capistrano/elobuff/helpers.rb
|
47
55
|
- lib/capistrano/elobuff/recipes/bundler.rb
|
48
56
|
- lib/capistrano/elobuff/recipes/code.rb
|