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 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