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 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
@@ -2,5 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in kicker.gemspec
4
4
  gemspec
5
- gem "excon", "~>0.17.0"
6
- gem "fog", "~>1.7.0"
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.7.0')
32
+ gem.add_dependency('fog', '~> 1.12.1')
32
33
  end
@@ -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
@@ -0,0 +1,7 @@
1
+ require "aws-kicker/version"
2
+
3
+ module Aws
4
+ module Kicker
5
+ # Your code goes here...
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Aws
2
+ module Kicker
3
+ VERSION = "0.0.4"
4
+ end
5
+ end
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
- # build out the full config for each node, supplying defaults from the
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
- user_data = File.read('user-data.sh')
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
- connection = Stack.connect(config)
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.3
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-02-21 00:00:00.000000000 Z
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.7.0
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.7.0
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. Each instance is described in the Stackfile & provisioned using variety
142
- of methods. Supported models include: EC2 Create with user-data, cloud-init from
143
- user-data (installs masterless puppet), puppet provision the instance. Other models
144
- could include using a puppet master, Chef Solo or Chef Server/Hosted. Amazon EC2
145
- interaction is done through fog, so other providers should be easily added. The
146
- guiding principle is that your Stackfile should be shareable & re-useable by others,
147
- and support templates, so that other users can use the template and easily adjust
148
- items in the stack (such as the instance size used, DNS Domain updated during deploy,
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
@@ -1,5 +0,0 @@
1
- require "kicker/version"
2
-
3
- module Kicker
4
- # Your code goes here...
5
- end
@@ -1,3 +0,0 @@
1
- module Kicker
2
- VERSION = "0.0.3"
3
- end