bschwartz-capsize 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +18 -0
- data/License.txt +67 -0
- data/Manifest.txt +24 -0
- data/README.textile +83 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +76 -0
- data/config/requirements.rb +18 -0
- data/examples/capsize.yml.template +67 -0
- data/examples/deploy.rb +29 -0
- data/lib/capsize/capsize.rb +101 -0
- data/lib/capsize/configuration.rb +44 -0
- data/lib/capsize/ec2.rb +654 -0
- data/lib/capsize/ec2_plugin.rb +618 -0
- data/lib/capsize/meta_tasks.rb +156 -0
- data/lib/capsize/sqs.rb +57 -0
- data/lib/capsize/sqs_plugin.rb +128 -0
- data/lib/capsize/version.rb +9 -0
- data/lib/capsize.rb +26 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +27 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/test_capsize.rb +12 -0
- data/test/test_helper.rb +10 -0
- metadata +130 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :ec2 do
|
4
|
+
|
5
|
+
namespace :setup do
|
6
|
+
|
7
|
+
desc <<-DESC
|
8
|
+
Initialize Capsize config.
|
9
|
+
You can run this command as often as you like.
|
10
|
+
It will not overwrite config files on multiple runs.
|
11
|
+
- Create :capsize_config_dir
|
12
|
+
- Create :capsize_secure_config_dir
|
13
|
+
- Copy capsize.yml.template to :capsize_config_dir/capsize.yml unless it already exists
|
14
|
+
- Automatically generate :capsize_secure_config_dir/secure.yml unless it already exists
|
15
|
+
- Instruct user to test configuration with "cap ec2:images:describe"
|
16
|
+
- Instruct user how to create a new keypair
|
17
|
+
- Instruct user how to setup a new security group.
|
18
|
+
DESC
|
19
|
+
task :default do
|
20
|
+
|
21
|
+
# Make the standard config dir if it doesn't exist already
|
22
|
+
unless File.exists?(fetch(:capsize_config_dir))
|
23
|
+
FileUtils.mkdir fetch(:capsize_config_dir)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Make the secure config dir if it doesn't exist already
|
27
|
+
unless File.exists?(fetch(:capsize_secure_config_dir))
|
28
|
+
FileUtils.mkdir fetch(:capsize_secure_config_dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
# copy the standard config file template, unless the dest file alread exists
|
32
|
+
unless File.exists?("#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}")
|
33
|
+
puts "Please enter your EC2 account information."
|
34
|
+
puts "We'll then write it to a config file at #{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}"
|
35
|
+
|
36
|
+
require "yaml"
|
37
|
+
set :aws_access_key_id, proc { Capistrano::CLI.ui.ask("AWS Access Key ID : ") }
|
38
|
+
set :aws_secret_access_key, proc { Capistrano::CLI.ui.ask("AWS Secret Access Key : ") }
|
39
|
+
|
40
|
+
yaml = {}
|
41
|
+
|
42
|
+
# Populate production element
|
43
|
+
yaml['common'] = {}
|
44
|
+
yaml['common']['aws_access_key_id'] = aws_access_key_id
|
45
|
+
yaml['common']['aws_secret_access_key'] = aws_secret_access_key
|
46
|
+
|
47
|
+
yaml = YAML::dump(yaml).split("\n").collect { |line| line == "common: " ? line += "&common" : line }.join("\n")
|
48
|
+
|
49
|
+
env_config =<<EOF
|
50
|
+
|
51
|
+
|
52
|
+
development:
|
53
|
+
<<: *common
|
54
|
+
|
55
|
+
# Uncomment and I only apply to the dev environment
|
56
|
+
# or overwrite a common value
|
57
|
+
#foo: 'bar'
|
58
|
+
|
59
|
+
test:
|
60
|
+
<<: *common
|
61
|
+
|
62
|
+
staging:
|
63
|
+
<<: *common
|
64
|
+
|
65
|
+
production:
|
66
|
+
<<: *common
|
67
|
+
|
68
|
+
# Uncomment and I only apply to the production environment
|
69
|
+
# or overwrite a common value
|
70
|
+
#foo: 'baz'
|
71
|
+
EOF
|
72
|
+
|
73
|
+
yaml += env_config
|
74
|
+
|
75
|
+
File.open("#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}", 'w') do |file|
|
76
|
+
file.write(yaml)
|
77
|
+
end
|
78
|
+
File.chmod 0664, "#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}"
|
79
|
+
else
|
80
|
+
puts "Warning : The following file was not copied over since it already exists: " + "#{fetch(:capsize_secure_config_dir)}/#{fetch(:capsize_secure_config_file_name)}"
|
81
|
+
end
|
82
|
+
|
83
|
+
unless File.exists?("#{fetch(:capsize_config_dir)}/#{fetch(:capsize_config_file_name)}")
|
84
|
+
FileUtils.cp("#{fetch(:capsize_examples_dir)}/capsize.yml.template", "#{fetch(:capsize_config_dir)}/#{fetch(:capsize_config_file_name)}", :verbose => true)
|
85
|
+
else
|
86
|
+
puts "Warning : The following file was not copied over since it already exists: " + "#{fetch(:capsize_config_dir)}/#{fetch(:capsize_config_file_name)}"
|
87
|
+
end
|
88
|
+
|
89
|
+
check
|
90
|
+
|
91
|
+
ec2.keypairs.create
|
92
|
+
|
93
|
+
ec2.security_groups.create_with_standard_ports
|
94
|
+
|
95
|
+
message = <<-MESSAGE
|
96
|
+
|
97
|
+
Next up: Pick an Amazon Machine Image and Run it!
|
98
|
+
|
99
|
+
Now you need to select an Amazon EC2 image ID that you want to start as a new
|
100
|
+
instance. The easiest way to do that is to get a list of available images from EC2.
|
101
|
+
|
102
|
+
# Show ALL registered images
|
103
|
+
cap ec2:images:show
|
104
|
+
|
105
|
+
# Show MY registered images
|
106
|
+
cap ec2:images:show OWNER_ID='self'
|
107
|
+
|
108
|
+
# Show the AMAZON registered images
|
109
|
+
cap ec2:images:show OWNER_ID='amazon'
|
110
|
+
|
111
|
+
Select an 'imageId' from the results, and run it:
|
112
|
+
|
113
|
+
cap ec2:instances:run IMAGE_ID='ami-2bb65342'
|
114
|
+
|
115
|
+
You should see some progress information scroll by and finally you should see
|
116
|
+
a description of the key attributes of your running intance (dnsName and instanceId
|
117
|
+
are likely most important).
|
118
|
+
|
119
|
+
Now lets connect to it with SSH (this may take a few tries, sometimes it takes a
|
120
|
+
minute for the new instance to respond to SSH):
|
121
|
+
|
122
|
+
cap ec2:instances:ssh INSTANCE_ID='i-xxxxxx'
|
123
|
+
|
124
|
+
If you want to terminate your instance...
|
125
|
+
|
126
|
+
cap ec2:instances:terminate INSTANCE_ID='i-xxxxxx'
|
127
|
+
|
128
|
+
Enjoy Capsize!
|
129
|
+
|
130
|
+
MESSAGE
|
131
|
+
|
132
|
+
puts message
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
desc <<-DESC
|
137
|
+
Test your Capsize config.
|
138
|
+
Run a simple test which will validate that your Capsize config
|
139
|
+
is setup and working properly when querying the Amazon EC2 servers.
|
140
|
+
DESC
|
141
|
+
task :check do
|
142
|
+
|
143
|
+
begin
|
144
|
+
capsize_ec2.describe_images(:owner_id => "amazon")
|
145
|
+
puts "Congratulations! Your credentials are verified and you are communicating properly with Amazon's EC2 service."
|
146
|
+
rescue Exception => e
|
147
|
+
puts "The test of your Capsize config failed with the following error: " + e
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
data/lib/capsize/sqs.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :sqs do
|
4
|
+
|
5
|
+
namespace :messages do
|
6
|
+
|
7
|
+
task :receive do
|
8
|
+
message = capsize_sqs.receive_message
|
9
|
+
unless message.nil?
|
10
|
+
puts message.body
|
11
|
+
else
|
12
|
+
puts "No Message"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
task :send_message do
|
17
|
+
raise Exception, "message required" if capsize.get(:message).nil? || capsize.get(:message).empty?
|
18
|
+
begin
|
19
|
+
capsize_sqs.send_message(capsize.get(:message))
|
20
|
+
rescue Exception => e
|
21
|
+
raise e
|
22
|
+
else
|
23
|
+
puts "Message sent to #{capsize.get(:queue_name)} Queue"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
namespace :queue do
|
30
|
+
|
31
|
+
task :delete do
|
32
|
+
begin
|
33
|
+
raise Exception unless capsize_sqs.delete
|
34
|
+
rescue Exception => e
|
35
|
+
puts "Queue #{queue_name} not deleted"
|
36
|
+
raise e
|
37
|
+
else
|
38
|
+
puts "Queue #{queue_name} deleted"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
task :delete! do
|
43
|
+
begin
|
44
|
+
raise Exception unless capsize_sqs.delete!
|
45
|
+
rescue Exception => e
|
46
|
+
puts "Queue #{queue_name} not deleted"
|
47
|
+
raise e
|
48
|
+
else
|
49
|
+
puts "Queue #{queue_name} deleted"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Capsize
|
2
|
+
module CapsizeSQS
|
3
|
+
include Capsize
|
4
|
+
|
5
|
+
#Creqte the XML for our CapQueue messages
|
6
|
+
def build_xml
|
7
|
+
body = ""
|
8
|
+
xml = Builder::XmlMarkup.new(:target => body, :indent => 2)
|
9
|
+
xml.command do
|
10
|
+
xml.hosts do
|
11
|
+
get(:hosts).split(/,/).each do |host|
|
12
|
+
xml.host host
|
13
|
+
end unless get(:hosts).nil?
|
14
|
+
end
|
15
|
+
xml.environment do
|
16
|
+
get(:environment).split(/,/).each do |keyvar|
|
17
|
+
xml.variable do
|
18
|
+
key, var = keyvar.split(/=/,2)
|
19
|
+
var.gsub!(/("|')/,'')
|
20
|
+
xml.key key
|
21
|
+
xml.var var
|
22
|
+
end
|
23
|
+
end unless get(:environment).nil?
|
24
|
+
end
|
25
|
+
xml.variables do
|
26
|
+
get(:variables).split(/,/).each do |keyvar|
|
27
|
+
xml.variable do
|
28
|
+
key, var = keyvar.split(/=/,2)
|
29
|
+
var.gsub!(/("|')/,'')
|
30
|
+
xml.key key
|
31
|
+
xml.var var
|
32
|
+
end
|
33
|
+
end unless get(:variables).nil?
|
34
|
+
end
|
35
|
+
xml.task get(:task)
|
36
|
+
end
|
37
|
+
body
|
38
|
+
end
|
39
|
+
|
40
|
+
#returns an instance of SQS::Queue
|
41
|
+
def connect
|
42
|
+
set :aws_access_key_id, get(:aws_access_key_id)
|
43
|
+
set :aws_secret_access_key, get(:aws_secret_access_key)
|
44
|
+
|
45
|
+
raise Exception, "You must have an :aws_access_key_id defined in your config." if fetch(:aws_access_key_id).nil? || fetch(:aws_access_key_id).empty?
|
46
|
+
raise Exception, "You must have an :aws_secret_access_key defined in your config." if fetch(:aws_secret_access_key).nil? || fetch(:aws_secret_access_key).empty?
|
47
|
+
|
48
|
+
SQS.access_key_id = fetch(:aws_access_key_id)
|
49
|
+
SQS.secret_access_key = fetch(:aws_secret_access_key)
|
50
|
+
|
51
|
+
queue = nil
|
52
|
+
begin
|
53
|
+
queue = SQS.get_queue queue_name
|
54
|
+
rescue
|
55
|
+
queue = SQS.create_queue queue_name
|
56
|
+
ensure
|
57
|
+
return queue
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def delete( options=nil )
|
62
|
+
queue = connect()
|
63
|
+
queue.delete(options)
|
64
|
+
end
|
65
|
+
|
66
|
+
def delete!
|
67
|
+
queue = connect()
|
68
|
+
queue.delete!
|
69
|
+
end
|
70
|
+
|
71
|
+
def send_message( m )
|
72
|
+
queue = connect()
|
73
|
+
queue.send_message(m)
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_queue_attributes( force=false )
|
77
|
+
queue = connect()
|
78
|
+
queue.get_queue_attributes(force)
|
79
|
+
end
|
80
|
+
|
81
|
+
def set_queue_attributes( atts={} )
|
82
|
+
queue = connect()
|
83
|
+
queue.set_queue_attributes(atts)
|
84
|
+
end
|
85
|
+
|
86
|
+
def empty?
|
87
|
+
queue = connect()
|
88
|
+
queue.empty?
|
89
|
+
end
|
90
|
+
|
91
|
+
def peek_message
|
92
|
+
queue = connect()
|
93
|
+
queue.peek_message
|
94
|
+
end
|
95
|
+
|
96
|
+
def peek_messages( options={} )
|
97
|
+
queue = connect()
|
98
|
+
queue.peek_messages(options)
|
99
|
+
end
|
100
|
+
|
101
|
+
def receive_message
|
102
|
+
queue = connect()
|
103
|
+
queue.receive_message
|
104
|
+
end
|
105
|
+
|
106
|
+
def receive_messages( options={} )
|
107
|
+
queue = connect()
|
108
|
+
queue.receive_messages(options)
|
109
|
+
end
|
110
|
+
|
111
|
+
def add_grant( options={} )
|
112
|
+
queue = connect()
|
113
|
+
queue.add_grant(options)
|
114
|
+
end
|
115
|
+
|
116
|
+
def remove_grant( options={} )
|
117
|
+
queue = connect()
|
118
|
+
queue.remove_grant(options)
|
119
|
+
end
|
120
|
+
|
121
|
+
def list_grants
|
122
|
+
queue = connect()
|
123
|
+
queue.list_grants
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
128
|
+
Capistrano.plugin :capsize_sqs, Capsize::CapsizeSQS
|
data/lib/capsize.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Require all necessary libraries
|
2
|
+
%w[
|
3
|
+
rubygems
|
4
|
+
ostruct
|
5
|
+
yaml
|
6
|
+
fileutils
|
7
|
+
builder
|
8
|
+
capistrano
|
9
|
+
EC2
|
10
|
+
sqs
|
11
|
+
capsize/version
|
12
|
+
capsize/capsize.rb
|
13
|
+
capsize/meta_tasks
|
14
|
+
capsize/ec2
|
15
|
+
capsize/ec2_plugin
|
16
|
+
capsize/sqs
|
17
|
+
capsize/sqs_plugin
|
18
|
+
capsize/configuration
|
19
|
+
].each { |lib|
|
20
|
+
begin
|
21
|
+
require lib
|
22
|
+
rescue Exception => e
|
23
|
+
puts "The loading of '#{lib}' failed in capsize.rb with message : " + e
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
}
|