aws-kicker 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +48 -0
- data/Gemfile +0 -2
- data/aws-kicker.gemspec +5 -4
- data/bin/{kicker → aws-kicker} +4 -4
- data/lib/aws-kicker.rb +7 -0
- data/lib/aws-kicker/version.rb +5 -0
- data/lib/stack.rb +86 -24
- data/lib/write-mime-multipart +118 -0
- metadata +34 -17
- data/lib/kicker.rb +0 -5
- data/lib/kicker/version.rb +0 -3
data/.rvmrc
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
|
+
# Only full ruby name is supported here, for short names use:
|
8
|
+
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
+
environment_id="ruby-1.9.3@aws-kicker"
|
10
|
+
|
11
|
+
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
+
# rvmrc_rvm_version="1.17.3 (stable)" # 1.10.1 seams as a safe start
|
13
|
+
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
|
+
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
|
+
# return 1
|
16
|
+
# }
|
17
|
+
|
18
|
+
# First we attempt to load the desired environment directly from the environment
|
19
|
+
# file. This is very fast and efficient compared to running through the entire
|
20
|
+
# CLI and selector. If you want feedback on which environment was used then
|
21
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
22
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
|
23
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
24
|
+
then
|
25
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
26
|
+
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
|
27
|
+
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
|
28
|
+
else
|
29
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
30
|
+
rvm --create "$environment_id" || {
|
31
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
32
|
+
return 1
|
33
|
+
}
|
34
|
+
fi
|
35
|
+
|
36
|
+
# If you use bundler, this might be useful to you:
|
37
|
+
# if [[ -s Gemfile ]] && {
|
38
|
+
# ! builtin command -v bundle >/dev/null ||
|
39
|
+
# builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
|
40
|
+
# }
|
41
|
+
# then
|
42
|
+
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
|
43
|
+
# gem install bundler
|
44
|
+
# fi
|
45
|
+
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
|
46
|
+
# then
|
47
|
+
# bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
|
48
|
+
# fi
|
data/Gemfile
CHANGED
data/aws-kicker.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'kicker/version'
|
4
|
+
require 'aws-kicker/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "aws-kicker"
|
8
|
-
gem.version = Kicker::VERSION
|
8
|
+
gem.version = Aws::Kicker::VERSION
|
9
9
|
gem.authors = ["Simon McCartney"]
|
10
10
|
gem.email = ["simon@mccartney.ie"]
|
11
11
|
gem.description = %q{Utility for kicking an application stack into life on Amazon EC2}
|
12
|
-
gem.summary = %q{Stacks are built from a collection of instances required to build an application stack.
|
12
|
+
gem.summary = %q{Stacks are built from a collection of instances required to build an application stack.
|
13
13
|
Each instance is described in the Stackfile & provisioned using variety of methods. Supported models include:
|
14
14
|
EC2 Create with user-data, cloud-init from user-data (installs masterless puppet), puppet provision the instance.
|
15
15
|
|
@@ -27,6 +27,7 @@ The guiding principle is that your Stackfile should be shareable & re-useable by
|
|
27
27
|
gem.add_development_dependency('rdoc')
|
28
28
|
gem.add_development_dependency('aruba')
|
29
29
|
gem.add_development_dependency('rake', '~> 0.9.2')
|
30
|
+
gem.add_development_dependency('gem-release')
|
30
31
|
gem.add_dependency('methadone', '~> 1.2.4')
|
31
|
-
gem.add_dependency('fog', '~> 1.
|
32
|
+
gem.add_dependency('fog', '~> 1.12.1')
|
32
33
|
end
|
data/bin/{kicker → aws-kicker}
RENAMED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'optparse'
|
4
4
|
require 'methadone'
|
5
|
-
require 'kicker'
|
5
|
+
require 'aws-kicker'
|
6
6
|
require 'stack'
|
7
7
|
require 'pp'
|
8
8
|
|
@@ -41,7 +41,7 @@ class App
|
|
41
41
|
if options['delete-node']
|
42
42
|
info { "delete-node passed #{options['delete-node']}" }
|
43
43
|
Stack.delete_node(config, options['delete-node'])
|
44
|
-
end
|
44
|
+
end
|
45
45
|
|
46
46
|
if options['validate']
|
47
47
|
info { 'Attemptying to validate the config' }
|
@@ -74,8 +74,8 @@ class App
|
|
74
74
|
on("--replace-node NODE", "Replace a give node")
|
75
75
|
on("--delete-node NODE", "Destroy a node, including any shared CM & DNS")
|
76
76
|
on("--validate", "Validate the config, check as much as possible with out creating nodes")
|
77
|
-
|
78
|
-
version Kicker::VERSION
|
77
|
+
|
78
|
+
version Aws::Kicker::VERSION
|
79
79
|
|
80
80
|
use_log_level_option
|
81
81
|
|
data/lib/aws-kicker.rb
ADDED
data/lib/stack.rb
CHANGED
@@ -3,10 +3,21 @@ require 'fog'
|
|
3
3
|
|
4
4
|
module Stack
|
5
5
|
|
6
|
+
Logger = Logger.new(STDOUT)
|
7
|
+
Logger.level = ::Logger::INFO
|
8
|
+
Logger.datetime_format = "%Y-%m-%d %H:%M:%S"
|
9
|
+
Logger.formatter = proc do |severity, datetime, progname, msg|
|
10
|
+
"#{datetime} #{severity}: #{msg}\n"
|
11
|
+
end
|
12
|
+
|
13
|
+
@@gemhome = File.absolute_path(File.realpath(File.dirname(File.expand_path(__FILE__)) + '/..'))
|
14
|
+
|
6
15
|
def Stack.load_config(configfile, stack)
|
7
16
|
config_raw = File.read(configfile)
|
8
|
-
eval(config_raw)
|
17
|
+
eval(config_raw)
|
18
|
+
|
9
19
|
config = StackConfig::Stacks[stack]
|
20
|
+
config[:stackhome] = File.dirname(File.expand_path(configfile))
|
10
21
|
config
|
11
22
|
end
|
12
23
|
|
@@ -19,20 +30,25 @@ module Stack
|
|
19
30
|
end
|
20
31
|
|
21
32
|
def Stack.populate_config(config)
|
22
|
-
|
33
|
+
|
34
|
+
config[:find_file_paths] = Array.new if config[:find_file_paths].nil?
|
35
|
+
|
36
|
+
# build out the full config for each node, supplying defaults from the
|
23
37
|
# global config if explicitly supplied
|
24
38
|
config[:node_details] = Hash.new if config[:node_details].nil?
|
25
39
|
|
26
40
|
config[:roles].each do |role, role_details|
|
27
41
|
fqdn = role.to_s + '.' + config[:dns_domain]
|
28
|
-
|
29
|
-
config[:node_details][fqdn] = {
|
42
|
+
|
43
|
+
config[:node_details][fqdn] = {
|
30
44
|
# set the node details from the role, if not specified in the role, use the config global
|
31
45
|
# (takes advantage of left to right evaluation of ||)
|
32
46
|
:flavor_id => (role_details[:flavor_id] || config[:flavor_id]),
|
33
47
|
:count => (role_details[:count] || 1),
|
34
48
|
:publish_private_ip => (role_details[:publish_private_ip] || false),
|
35
|
-
:dns_wildcard => (role_details[:dns_wildcard] || false)
|
49
|
+
:dns_wildcard => (role_details[:dns_wildcard] || false),
|
50
|
+
:bootstrap => (role_details[:bootstrap] || 'user-data.sh'),
|
51
|
+
:cloud_config_yaml => (role_details[:cloud_config_yaml] || 'cloud-init.yaml'),
|
36
52
|
}
|
37
53
|
end
|
38
54
|
end
|
@@ -43,7 +59,7 @@ module Stack
|
|
43
59
|
fqdn = role.to_s + '.' + config[:dns_domain]
|
44
60
|
stack_hostnames << fqdn
|
45
61
|
end
|
46
|
-
stack_hostnames
|
62
|
+
stack_hostnames
|
47
63
|
end
|
48
64
|
|
49
65
|
def Stack.deploy_all(config)
|
@@ -64,17 +80,25 @@ module Stack
|
|
64
80
|
end
|
65
81
|
|
66
82
|
# Ubuntu 8.04/Hardy doesn't do full cloud-init, so we have to script setting the hostname
|
67
|
-
|
83
|
+
libdir = File.realpath(@@gemhome + '/lib')
|
84
|
+
|
85
|
+
bootstrap_abs = Stack.find_file(config, config[:node_details][fqdn][:bootstrap])
|
86
|
+
cloud_config_yaml_abs = Stack.find_file(config, config[:node_details][fqdn][:cloud_config_yaml])
|
87
|
+
|
88
|
+
multipart_cmd = "#{libdir}/write-mime-multipart #{bootstrap_abs} #{cloud_config_yaml_abs}"
|
89
|
+
user_data = `#{multipart_cmd}`
|
90
|
+
|
68
91
|
user_data.gsub!(/rentpro-unconfigured/, hostname)
|
69
92
|
user_data.gsub!(/rentpro-stage.local/, config[:dns_domain])
|
70
93
|
|
94
|
+
|
71
95
|
# pp multipart
|
72
96
|
#
|
73
97
|
puts "Bootstraping new instance - #{fqdn}, in #{config[:availability_zone]}, flavor #{config[:node_details][fqdn][:flavor_id]}, image_id #{config[:image_id]}"
|
74
|
-
server = connection.servers.create({
|
98
|
+
server = connection.servers.create({
|
75
99
|
:name => fqdn,
|
76
100
|
:hostname => fqdn,
|
77
|
-
:availability_zone => config[:availability_zone],
|
101
|
+
:availability_zone => config[:availability_zone],
|
78
102
|
:flavor_id => config[:node_details][fqdn][:flavor_id],
|
79
103
|
:image_id => config[:image_id],
|
80
104
|
:key_name => config[:keypair],
|
@@ -86,10 +110,11 @@ module Stack
|
|
86
110
|
server.wait_for { ready? }
|
87
111
|
puts "#{role.to_s} is booted, #{server.public_ip_address}/#{server.private_ip_address}"
|
88
112
|
|
113
|
+
if false
|
89
114
|
# create/update the public & private DNS for this host
|
90
115
|
Stack.update_dns(role.to_s + '-public.' + config[:dns_domain], server.public_ip_address, config)
|
91
116
|
Stack.update_dns(role.to_s + '-private.' + config[:dns_domain], server.private_ip_address, config)
|
92
|
-
|
117
|
+
|
93
118
|
# create the dns
|
94
119
|
if (role_details[:publish_private_ip] == true && (!role_details[:publish_private_ip].nil?))
|
95
120
|
ip_address = server.private_ip_address
|
@@ -103,6 +128,7 @@ module Stack
|
|
103
128
|
wildcard = "*." + config[:dns_domain]
|
104
129
|
Stack.update_dns(wildcard, ip_address, config)
|
105
130
|
end
|
131
|
+
end
|
106
132
|
end
|
107
133
|
end
|
108
134
|
|
@@ -111,14 +137,14 @@ module Stack
|
|
111
137
|
dns = Fog::DNS.new({ :provider => config[:provider],
|
112
138
|
:aws_access_key_id => config[:aws_access_key_id],
|
113
139
|
:aws_secret_access_key => config[:aws_secret_access_key] })
|
114
|
-
|
140
|
+
|
115
141
|
# pp dns.get_hosted_zone(config[:dns_id])
|
116
|
-
|
142
|
+
|
117
143
|
bmtw = dns.zones.get(config[:dns_id])
|
118
|
-
|
119
|
-
record = bmtw.records.get(fqdn)
|
120
|
-
if record
|
121
|
-
record.modify(:value => ip_address) if record
|
144
|
+
|
145
|
+
record = bmtw.records.get(fqdn)
|
146
|
+
if record
|
147
|
+
record.modify(:value => ip_address) if record
|
122
148
|
else
|
123
149
|
bmtw.records.create(:value => ip_address, :name => fqdn, :type => 'A')
|
124
150
|
end
|
@@ -129,7 +155,7 @@ module Stack
|
|
129
155
|
dns = Fog::DNS.new({ :provider => config[:provider],
|
130
156
|
:aws_access_key_id => config[:aws_access_key_id],
|
131
157
|
:aws_secret_access_key => config[:aws_secret_access_key] })
|
132
|
-
|
158
|
+
|
133
159
|
zone = dns.zones.get(config[:dns_id])
|
134
160
|
if zone.records.empty?
|
135
161
|
puts "No DNS records found in #{config[:dns_domain]}"
|
@@ -138,13 +164,13 @@ module Stack
|
|
138
164
|
zone.records.each do |record|
|
139
165
|
printf("%40s %20s %5s %5d\n", record.name, record.value, record.type, record.ttl)
|
140
166
|
end
|
141
|
-
end
|
167
|
+
end
|
142
168
|
end
|
143
169
|
|
144
170
|
def Stack.get_running(config)
|
145
171
|
# create a connection
|
146
172
|
connection = Stack.connect(config)
|
147
|
-
|
173
|
+
|
148
174
|
# generate all the names that this stack will use
|
149
175
|
stack_hostnames = Stack.generate_hostnames(config)
|
150
176
|
|
@@ -159,7 +185,7 @@ module Stack
|
|
159
185
|
end
|
160
186
|
end
|
161
187
|
end
|
162
|
-
running_instances
|
188
|
+
running_instances
|
163
189
|
end
|
164
190
|
|
165
191
|
def Stack.show_running(config)
|
@@ -169,14 +195,14 @@ module Stack
|
|
169
195
|
puts "#{instance} id=#{instance_details.id} flavor_id=#{instance_details.flavor_id} public_ip=#{instance_details.public_ip_address} private_ip=#{instance_details.private_ip_address}"
|
170
196
|
end
|
171
197
|
end
|
172
|
-
|
198
|
+
|
173
199
|
def Stack.delete_node(config, fqdn)
|
174
200
|
running_instances = Stack.get_running(config)
|
175
201
|
if running_instances[fqdn].nil?
|
176
202
|
puts "ERROR: #{fqdn} isn't running!"
|
177
203
|
exit
|
178
204
|
else
|
179
|
-
|
205
|
+
Stack.connect(config)
|
180
206
|
pp running_instances[fqdn]
|
181
207
|
running_instances[fqdn].destroy
|
182
208
|
end
|
@@ -185,7 +211,7 @@ module Stack
|
|
185
211
|
def Stack.show_details(config)
|
186
212
|
# create a connection
|
187
213
|
connection = Stack.connect(config)
|
188
|
-
|
214
|
+
|
189
215
|
pp connection.describe_regions
|
190
216
|
pp connection.describe_availability_zones
|
191
217
|
|
@@ -205,7 +231,7 @@ module Stack
|
|
205
231
|
|
206
232
|
def shutdown_all(config)
|
207
233
|
# shutdown all instances
|
208
|
-
connection.servers.select do |server|
|
234
|
+
connection.servers.select do |server|
|
209
235
|
puts "Running server:"
|
210
236
|
# pp server
|
211
237
|
# server.ready? && server.destroy
|
@@ -219,4 +245,40 @@ module Stack
|
|
219
245
|
pp connection
|
220
246
|
pp connection.images.get(config[:image_id])
|
221
247
|
end
|
248
|
+
|
249
|
+
def Stack.find_file(config, filename)
|
250
|
+
# find a file, using the standard path precedence
|
251
|
+
# 1) cwd
|
252
|
+
# 2) stackhome
|
253
|
+
# 2) stackhome + find_file_paths
|
254
|
+
# 3) gemhome/lib
|
255
|
+
|
256
|
+
if filename.nil? || filename.empty?
|
257
|
+
raise ArgumentError
|
258
|
+
end
|
259
|
+
|
260
|
+
dirs = [ '.' ] # current directory
|
261
|
+
dirs.push(config[:stackhome])
|
262
|
+
config[:find_file_paths].each { |fp| dirs.push(File.join(config[:stackhome], fp)) }
|
263
|
+
dirs.push(File.join(@@gemhome, 'lib'))
|
264
|
+
dirs.push('') # find absolute paths
|
265
|
+
dirs.flatten!
|
266
|
+
|
267
|
+
Logger.debug "find_file, looking for #{filename} in #{dirs}"
|
268
|
+
filename_fqp = ''
|
269
|
+
dirs.each do |dir|
|
270
|
+
fqp = File.join(dir, filename)
|
271
|
+
Logger.debug "find_file: checking #{fqp}"
|
272
|
+
if File.file?(fqp)
|
273
|
+
Logger.debug "find_file: found #{fqp}!"
|
274
|
+
filename_fqp = File.expand_path(fqp)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
if filename_fqp.empty?
|
279
|
+
Logger.warn "couldn't find #{filename} in #{dirs}"
|
280
|
+
filename_fqp = nil
|
281
|
+
end
|
282
|
+
filename_fqp
|
283
|
+
end
|
222
284
|
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
#!/usr/bin/python2.6
|
2
|
+
# largely taken from python examples
|
3
|
+
# http://docs.python.org/library/email-examples.html
|
4
|
+
|
5
|
+
import os
|
6
|
+
import sys
|
7
|
+
import smtplib
|
8
|
+
# For guessing MIME type based on file name extension
|
9
|
+
import mimetypes
|
10
|
+
|
11
|
+
from email import encoders
|
12
|
+
from email.message import Message
|
13
|
+
from email.mime.base import MIMEBase
|
14
|
+
from email.mime.multipart import MIMEMultipart
|
15
|
+
from email.mime.text import MIMEText
|
16
|
+
from optparse import OptionParser
|
17
|
+
import gzip
|
18
|
+
|
19
|
+
from base64 import b64encode
|
20
|
+
|
21
|
+
COMMASPACE = ', '
|
22
|
+
|
23
|
+
starts_with_mappings={
|
24
|
+
'#include' : 'text/x-include-url',
|
25
|
+
'#!' : 'text/x-shellscript',
|
26
|
+
'#cloud-config' : 'text/cloud-config',
|
27
|
+
'#upstart-job' : 'text/upstart-job',
|
28
|
+
'#part-handler' : 'text/part-handler',
|
29
|
+
'#cloud-boothook' : 'text/cloud-boothook'
|
30
|
+
}
|
31
|
+
|
32
|
+
def get_type(fname,deftype):
|
33
|
+
f = file(fname,"rb")
|
34
|
+
line = f.readline()
|
35
|
+
f.close()
|
36
|
+
rtype = deftype
|
37
|
+
for str,mtype in starts_with_mappings.items():
|
38
|
+
if line.startswith(str):
|
39
|
+
rtype = mtype
|
40
|
+
break
|
41
|
+
return(rtype)
|
42
|
+
|
43
|
+
def main():
|
44
|
+
outer = MIMEMultipart()
|
45
|
+
#outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory)
|
46
|
+
#outer['To'] = COMMASPACE.join(opts.recipients)
|
47
|
+
#outer['From'] = opts.sender
|
48
|
+
#outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'
|
49
|
+
|
50
|
+
parser = OptionParser()
|
51
|
+
|
52
|
+
parser.add_option("-o", "--output", dest="output",
|
53
|
+
help="write output to FILE [default %default]", metavar="FILE",
|
54
|
+
default="-")
|
55
|
+
parser.add_option("-z", "--gzip", dest="compress", action="store_true",
|
56
|
+
help="compress output", default=False)
|
57
|
+
parser.add_option("-d", "--default", dest="deftype",
|
58
|
+
help="default mime type [default %default]", default="text/plain")
|
59
|
+
parser.add_option("--delim", dest="delim",
|
60
|
+
help="delimiter [default %default]", default=":")
|
61
|
+
parser.add_option("-b", "--base64", dest="base64", action="store_true",
|
62
|
+
help="encode content base64", default=False)
|
63
|
+
|
64
|
+
(options, args) = parser.parse_args()
|
65
|
+
|
66
|
+
if (len(args)) < 1:
|
67
|
+
parser.error("Must give file list see '--help'")
|
68
|
+
|
69
|
+
for arg in args:
|
70
|
+
t = arg.split(options.delim, 1)
|
71
|
+
path=t[0]
|
72
|
+
if len(t) > 1:
|
73
|
+
mtype = t[1]
|
74
|
+
else:
|
75
|
+
mtype = get_type(path,options.deftype)
|
76
|
+
|
77
|
+
maintype, subtype = mtype.split('/', 1)
|
78
|
+
if maintype == 'text':
|
79
|
+
fp = open(path)
|
80
|
+
# Note: we should handle calculating the charset
|
81
|
+
msg = MIMEText(fp.read(), _subtype=subtype)
|
82
|
+
fp.close()
|
83
|
+
else:
|
84
|
+
fp = open(path, 'rb')
|
85
|
+
msg = MIMEBase(maintype, subtype)
|
86
|
+
msg.set_payload(fp.read())
|
87
|
+
fp.close()
|
88
|
+
# Encode the payload using Base64
|
89
|
+
encoders.encode_base64(msg)
|
90
|
+
|
91
|
+
# Set the filename parameter
|
92
|
+
msg.add_header('Content-Disposition', 'attachment',
|
93
|
+
filename=os.path.basename(path))
|
94
|
+
|
95
|
+
outer.attach(msg)
|
96
|
+
|
97
|
+
if options.output is "-":
|
98
|
+
ofile = sys.stdout
|
99
|
+
else:
|
100
|
+
ofile = file(options.output,"wb")
|
101
|
+
|
102
|
+
if options.base64:
|
103
|
+
output = b64encode(outer.as_string())
|
104
|
+
else:
|
105
|
+
output = outer.as_string()
|
106
|
+
|
107
|
+
if options.compress:
|
108
|
+
gfile = gzip.GzipFile(fileobj=ofile, filename = options.output )
|
109
|
+
gfile.write(output)
|
110
|
+
gfile.close()
|
111
|
+
else:
|
112
|
+
ofile.write(output)
|
113
|
+
|
114
|
+
ofile.close()
|
115
|
+
|
116
|
+
if __name__ == '__main__':
|
117
|
+
main()
|
118
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-kicker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
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: 2013-
|
12
|
+
date: 2013-06-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
@@ -59,6 +59,22 @@ dependencies:
|
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 0.9.2
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: gem-release
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
62
78
|
- !ruby/object:Gem::Dependency
|
63
79
|
name: methadone
|
64
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +98,7 @@ dependencies:
|
|
82
98
|
requirements:
|
83
99
|
- - ~>
|
84
100
|
- !ruby/object:Gem::Version
|
85
|
-
version: 1.
|
101
|
+
version: 1.12.1
|
86
102
|
type: :runtime
|
87
103
|
prerelease: false
|
88
104
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,29 +106,31 @@ dependencies:
|
|
90
106
|
requirements:
|
91
107
|
- - ~>
|
92
108
|
- !ruby/object:Gem::Version
|
93
|
-
version: 1.
|
109
|
+
version: 1.12.1
|
94
110
|
description: Utility for kicking an application stack into life on Amazon EC2
|
95
111
|
email:
|
96
112
|
- simon@mccartney.ie
|
97
113
|
executables:
|
98
|
-
- kicker
|
114
|
+
- aws-kicker
|
99
115
|
extensions: []
|
100
116
|
extra_rdoc_files: []
|
101
117
|
files:
|
102
118
|
- .gitignore
|
119
|
+
- .rvmrc
|
103
120
|
- Gemfile
|
104
121
|
- LICENSE.txt
|
105
122
|
- README.md
|
106
123
|
- README.rdoc
|
107
124
|
- Rakefile
|
108
125
|
- aws-kicker.gemspec
|
109
|
-
- bin/kicker
|
126
|
+
- bin/aws-kicker
|
110
127
|
- features/kicker.feature
|
111
128
|
- features/step_definitions/kicker_steps.rb
|
112
129
|
- features/support/env.rb
|
113
|
-
- lib/kicker.rb
|
114
|
-
- lib/kicker/version.rb
|
130
|
+
- lib/aws-kicker.rb
|
131
|
+
- lib/aws-kicker/version.rb
|
115
132
|
- lib/stack.rb
|
133
|
+
- lib/write-mime-multipart
|
116
134
|
- test/tc_something.rb
|
117
135
|
homepage: https://github.com/simonmcc/kicker
|
118
136
|
licenses: []
|
@@ -138,15 +156,14 @@ rubygems_version: 1.8.23
|
|
138
156
|
signing_key:
|
139
157
|
specification_version: 3
|
140
158
|
summary: ! 'Stacks are built from a collection of instances required to build an application
|
141
|
-
stack.
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
EC2 account & location)'
|
159
|
+
stack. Each instance is described in the Stackfile & provisioned using variety of
|
160
|
+
methods. Supported models include: EC2 Create with user-data, cloud-init from user-data
|
161
|
+
(installs masterless puppet), puppet provision the instance. Other models could
|
162
|
+
include using a puppet master, Chef Solo or Chef Server/Hosted. Amazon EC2 interaction
|
163
|
+
is done through fog, so other providers should be easily added. The guiding principle
|
164
|
+
is that your Stackfile should be shareable & re-useable by others, and support templates,
|
165
|
+
so that other users can use the template and easily adjust items in the stack (such
|
166
|
+
as the instance size used, DNS Domain updated during deploy, EC2 account & location)'
|
150
167
|
test_files:
|
151
168
|
- features/kicker.feature
|
152
169
|
- features/step_definitions/kicker_steps.rb
|
data/lib/kicker.rb
DELETED
data/lib/kicker/version.rb
DELETED