aws-kicker 0.0.3 → 0.0.4
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/.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