spiceweasel 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +15 -12
- data/bin/spiceweasel +11 -5
- data/lib/spiceweasel/cli.rb +6 -0
- data/lib/spiceweasel/cookbook_list.rb +26 -24
- data/lib/spiceweasel/data_bag_list.rb +25 -23
- data/lib/spiceweasel/environment_list.rb +8 -6
- data/lib/spiceweasel/node_list.rb +27 -25
- data/lib/spiceweasel/role_list.rb +8 -6
- data/lib/spiceweasel/version.rb +1 -1
- metadata +57 -85
data/README.md
CHANGED
@@ -4,17 +4,20 @@ Spiceweasel is a command-line tool for batch loading Chef infrastructure. It pro
|
|
4
4
|
|
5
5
|
The `examples` directory provides examples based on the Quick Starts provided at [http://help.opscode.com/kb/otherhelp](http://help.opscode.com/kb/otherhelp).
|
6
6
|
|
7
|
-
|
7
|
+
The [https://github.com/mattray/ravel-repo](https://github.com/mattray/ravel-repo) provides a working example for bootstrapping a Chef repository with Spiceweasel.
|
8
|
+
|
9
|
+
The [CHANGELOG.md](https://github.com/mattray/spiceweasel/blob/master/CHANGELOG.md) covers current, previous and future development milestones and contains the features backlog.
|
10
|
+
|
8
11
|
|
9
12
|
Requirements
|
10
13
|
============
|
11
14
|
Spiceweasel currently depends on `knife` to run commands for it. Infrastructure files must either end in .json or .yml to be processed.
|
12
15
|
|
13
|
-
Written with Chef 0.9.12
|
16
|
+
Written initially with Chef 0.9.12 (should still work) and continuing to develop with support for 0.10.
|
14
17
|
|
15
18
|
Testing
|
16
19
|
-------
|
17
|
-
Tested with Ubuntu 10.04 and Chef 0.9.16 and 0.10.
|
20
|
+
Tested with Ubuntu 10.04 and Chef 0.9.16 and 0.10.4.
|
18
21
|
|
19
22
|
File Syntax
|
20
23
|
===========
|
@@ -164,7 +167,7 @@ produces the knife commands
|
|
164
167
|
|
165
168
|
```
|
166
169
|
knife cookbook upload apache2
|
167
|
-
knife cookbook site download apt 1.1.0 --file cookbooks/apt.tgz
|
170
|
+
knife cookbook site download apt 1.1.0 --file cookbooks/apt.tgz
|
168
171
|
tar -C cookbooks/ -xf cookbooks/apt.tgz
|
169
172
|
knife cookbook upload apt
|
170
173
|
knife cookbook upload mysql
|
@@ -172,7 +175,7 @@ knife cookbook upload mysql
|
|
172
175
|
|
173
176
|
Environments
|
174
177
|
------------
|
175
|
-
The `environments` section of the JSON or YAML file currently supports `knife environment from file FOO` where `FOO` is the name of the environment file ending in `.rb` in the `environments` directory. The YAML snippet
|
178
|
+
The `environments` section of the JSON or YAML file currently supports `knife environment from file FOO` where `FOO` is the name of the environment file ending in `.rb` in the `environments` directory. The YAML snippet
|
176
179
|
|
177
180
|
``` yaml
|
178
181
|
environments:
|
@@ -181,7 +184,7 @@ environments:
|
|
181
184
|
- production:
|
182
185
|
```
|
183
186
|
|
184
|
-
produces the knife commands
|
187
|
+
produces the knife commands
|
185
188
|
|
186
189
|
```
|
187
190
|
knife environment from file development.rb
|
@@ -191,7 +194,7 @@ knife environment from file production.rb
|
|
191
194
|
|
192
195
|
Roles
|
193
196
|
-----
|
194
|
-
The `roles` section of the JSON or YAML file currently supports `knife role from file FOO` where `FOO` is the name of the role file ending in `.rb` in the `roles` directory. The YAML snippet
|
197
|
+
The `roles` section of the JSON or YAML file currently supports `knife role from file FOO` where `FOO` is the name of the role file ending in `.rb` in the `roles` directory. The YAML snippet
|
195
198
|
|
196
199
|
``` yaml
|
197
200
|
roles:
|
@@ -200,7 +203,7 @@ roles:
|
|
200
203
|
- webserver:
|
201
204
|
```
|
202
205
|
|
203
|
-
produces the knife commands
|
206
|
+
produces the knife commands
|
204
207
|
|
205
208
|
```
|
206
209
|
knife role from file base.rb
|
@@ -210,7 +213,7 @@ knife role from file webserver.rb
|
|
210
213
|
|
211
214
|
Data Bags
|
212
215
|
---------
|
213
|
-
The `data bags` section of the JSON or YAML file currently creates the data bags listed with `knife data bag create FOO` where `FOO` is the name of the data bag. Individual items may be added to the data bag as part of a JSON or YAML sequence, the assumption is made that they `.json` files and in the `data_bags/FOO` directory. You may also pass a wildcard as an entry to load all matching data bags (ie. `*`). Encrypted data bags are supported by listing `secret filename` as the first item (where `filename` is the secret key to be used). Assuming the presence of `dataA.json` and `dataB.json` in the `data_bags/data` directory, the YAML snippet
|
216
|
+
The `data bags` section of the JSON or YAML file currently creates the data bags listed with `knife data bag create FOO` where `FOO` is the name of the data bag. Individual items may be added to the data bag as part of a JSON or YAML sequence, the assumption is made that they `.json` files and in the `data_bags/FOO` directory. You may also pass a wildcard as an entry to load all matching data bags (ie. `*`). Encrypted data bags are supported by listing `secret filename` as the first item (where `filename` is the secret key to be used). Assuming the presence of `dataA.json` and `dataB.json` in the `data_bags/data` directory, the YAML snippet
|
214
217
|
|
215
218
|
``` yaml
|
216
219
|
data bags:
|
@@ -226,7 +229,7 @@ data bags:
|
|
226
229
|
- rabbitmq
|
227
230
|
```
|
228
231
|
|
229
|
-
produces the knife commands
|
232
|
+
produces the knife commands
|
230
233
|
|
231
234
|
```
|
232
235
|
knife data bag create users
|
@@ -243,7 +246,7 @@ knife data bag from file passwords data_bags/passwords/rabbitmq.json --secret-fi
|
|
243
246
|
|
244
247
|
Nodes
|
245
248
|
-----
|
246
|
-
The `nodes` section of the JSON or YAML file bootstraps a node for each entry where the entry is a hostname or provider and count. Each node requires 2 items after it in a sequence. The first item is the run_list and the second the CLI options used. The run_list may be space or comma-delimited. Validation is performed on the run_list components to ensure that only recipes and roles listed in the file are used. A shortcut syntax for bulk-creating nodes with various providers where the line starts with the provider and ends with the number of nodes to be provisioned. The YAML snippet
|
249
|
+
The `nodes` section of the JSON or YAML file bootstraps a node for each entry where the entry is a hostname or provider and count. Each node requires 2 items after it in a sequence. The first item is the run_list and the second the CLI options used. The run_list may be space or comma-delimited. Validation is performed on the run_list components to ensure that only recipes and roles listed in the file are used. A shortcut syntax for bulk-creating nodes with various providers where the line starts with the provider and ends with the number of nodes to be provisioned. The YAML snippet
|
247
250
|
|
248
251
|
``` yaml
|
249
252
|
nodes:
|
@@ -261,7 +264,7 @@ nodes:
|
|
261
264
|
- --image 49 --flavor 2
|
262
265
|
```
|
263
266
|
|
264
|
-
produces the knife commands
|
267
|
+
produces the knife commands
|
265
268
|
|
266
269
|
```
|
267
270
|
knife bootstrap serverA 'role[base]' -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
|
data/bin/spiceweasel
CHANGED
@@ -5,6 +5,8 @@ require 'yaml'
|
|
5
5
|
|
6
6
|
require 'spiceweasel'
|
7
7
|
|
8
|
+
options={'knife_options' => ''}
|
9
|
+
|
8
10
|
#process command line options
|
9
11
|
begin
|
10
12
|
ARGV << "-h" if ARGV.empty?
|
@@ -17,6 +19,10 @@ rescue OptionParser::InvalidOption => e
|
|
17
19
|
exit(-1)
|
18
20
|
end
|
19
21
|
|
22
|
+
if cli.config[:knifeconfig]
|
23
|
+
options['knife_options']=" -c "+cli.config[:knifeconfig]
|
24
|
+
end
|
25
|
+
|
20
26
|
begin
|
21
27
|
file = ARGV.last
|
22
28
|
STDOUT.puts "DEBUG: file: #{file}" if cli.config[:debug]
|
@@ -41,12 +47,12 @@ end
|
|
41
47
|
create = String.new()
|
42
48
|
delete = String.new()
|
43
49
|
|
44
|
-
cookbook_list = Spiceweasel::CookbookList.new(input['cookbooks'])
|
45
|
-
environment_list = Spiceweasel::EnvironmentList.new(input['environments'])
|
46
|
-
role_list = Spiceweasel::RoleList.new(input['roles'])
|
47
|
-
data_bag_list = Spiceweasel::DataBagList.new(input['data bags'])
|
50
|
+
cookbook_list = Spiceweasel::CookbookList.new(input['cookbooks'], options)
|
51
|
+
environment_list = Spiceweasel::EnvironmentList.new(input['environments'], options)
|
52
|
+
role_list = Spiceweasel::RoleList.new(input['roles'], options)
|
53
|
+
data_bag_list = Spiceweasel::DataBagList.new(input['data bags'], options)
|
48
54
|
|
49
|
-
node_list = Spiceweasel::NodeList.new(input['nodes'], cookbook_list, environment_list, role_list)
|
55
|
+
node_list = Spiceweasel::NodeList.new(input['nodes'], cookbook_list, environment_list, role_list, options)
|
50
56
|
|
51
57
|
create += cookbook_list.create
|
52
58
|
create += environment_list.create
|
data/lib/spiceweasel/cli.rb
CHANGED
@@ -44,4 +44,10 @@ class Spiceweasel::CLI
|
|
44
44
|
:boolean => true,
|
45
45
|
:proc => lambda {|v| puts "Spiceweasel: #{Spiceweasel::VERSION}" },
|
46
46
|
:exit => 0
|
47
|
+
|
48
|
+
option :knifeconfig,
|
49
|
+
:short => "-c CONFIG",
|
50
|
+
:long => "--knifeconfig CONFIG",
|
51
|
+
:description => "The knife.rb configuration file to use."
|
52
|
+
|
47
53
|
end
|
@@ -1,33 +1,35 @@
|
|
1
1
|
class Spiceweasel::CookbookList
|
2
|
-
def initialize(cookbooks = [])
|
2
|
+
def initialize(cookbooks = [], options = {})
|
3
3
|
@create = @delete = ''
|
4
4
|
@cookbooks = []
|
5
|
-
cookbooks
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
if
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
5
|
+
if cookbooks
|
6
|
+
cookbooks.each do |cookbook|
|
7
|
+
cb = cookbook.keys.first
|
8
|
+
if cookbook[cb] and cookbook[cb].length > 0
|
9
|
+
version = cookbook[cb][0].to_s || ""
|
10
|
+
args = cookbook[cb][1] || ""
|
11
|
+
end
|
12
|
+
STDOUT.puts "DEBUG: cookbook: #{cb} #{version}" if DEBUG
|
13
|
+
@delete += "knife cookbook#{options['knife_options']} delete #{cb} #{version} -y\n"
|
14
|
+
if File.directory?("cookbooks")
|
15
|
+
if version and File.directory?("cookbooks/#{cb}")
|
16
|
+
#check metadata.rb for requested version
|
17
|
+
metadata = File.open("cookbooks/#{cb}/metadata.rb").grep(/^version/)[0].split()[1].gsub(/"/,'').to_s
|
18
|
+
if (metadata != version)
|
19
|
+
raise "Invalid version #{version} of '#{cb}' requested, #{metadata} is already in the cookbooks directory."
|
20
|
+
exit(-1)
|
21
|
+
end
|
22
|
+
elsif !File.directory?("cookbooks/#{cb}")
|
23
|
+
@create += "knife cookbook#{options['knife_options']} site download #{cb} #{version} --file cookbooks/#{cb}.tgz #{args}\n"
|
24
|
+
@create += "tar -C cookbooks/ -xf cookbooks/#{cb}.tgz\n"
|
20
25
|
end
|
21
|
-
|
22
|
-
|
23
|
-
@create += "tar -C cookbooks/ -xf cookbooks/#{cb}.tgz\n"
|
26
|
+
else
|
27
|
+
STDERR.puts "cookbooks directory not found, validation and downloading skipped"
|
24
28
|
end
|
25
|
-
|
26
|
-
STDERR.puts "cookbooks directory not found, validation and downloading skipped"
|
27
|
-
end
|
28
|
-
@create += "knife cookbook upload #{cb}\n"
|
29
|
+
@create += "knife cookbook#{options['knife_options']} upload #{cb}\n"
|
29
30
|
|
30
|
-
|
31
|
+
@cookbooks << cb
|
32
|
+
end
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
@@ -1,28 +1,30 @@
|
|
1
1
|
class Spiceweasel::DataBagList
|
2
|
-
def initialize(data_bags = [])
|
2
|
+
def initialize(data_bags = [], options = {})
|
3
3
|
@create = @delete = ''
|
4
|
-
data_bags
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
4
|
+
if data_bags
|
5
|
+
data_bags.each do |data_bag|
|
6
|
+
STDOUT.puts "DEBUG: data bag: #{data_bag.keys[0]}" if DEBUG
|
7
|
+
@delete += "knife data bag#{options['knife_options']} delete #{data_bag.keys[0]} -y\n"
|
8
|
+
@create += "knife data bag#{options['knife_options']} create #{data_bag.keys[0]}\n"
|
9
|
+
items = data_bag[data_bag.keys[0]] || []
|
10
|
+
secret = nil
|
11
|
+
while item = items.shift
|
12
|
+
STDOUT.puts "DEBUG: data bag #{data_bag.keys[0]} item: #{item}" if DEBUG
|
13
|
+
if item.start_with?("secret")
|
14
|
+
secret = item.split()[1]
|
15
|
+
next
|
16
|
+
end
|
17
|
+
if item =~ /\*/ #wildcard support
|
18
|
+
files = Dir.glob("data_bags/#{data_bag.keys[0]}/#{item}.json")
|
19
|
+
items += files.collect {|x| x[x.rindex('/')+1..-6]}
|
20
|
+
puts items
|
21
|
+
next
|
22
|
+
end
|
23
|
+
if secret
|
24
|
+
@create += "knife data bag#{options['knife_options']} from file #{data_bag.keys[0]} data_bags/#{data_bag.keys[0]}/#{item}.json --secret-file #{secret}\n"
|
25
|
+
else
|
26
|
+
@create += "knife data bag#{options['knife_options']} from file #{data_bag.keys[0]} data_bags/#{data_bag.keys[0]}/#{item}.json\n"
|
27
|
+
end
|
26
28
|
end
|
27
29
|
end
|
28
30
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
class Spiceweasel::EnvironmentList
|
2
|
-
def initialize(environments = [])
|
2
|
+
def initialize(environments = [], options = {})
|
3
3
|
@create = @delete = ''
|
4
4
|
@environments = []
|
5
|
-
environments
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
if environments
|
6
|
+
environments.each do |environment|
|
7
|
+
STDOUT.puts "DEBUG: environment: #{environment.keys[0]}" if DEBUG
|
8
|
+
@delete += "knife environment#{options['knife_options']} delete #{environment.keys[0]} -y\n"
|
9
|
+
@create += "knife environment#{options['knife_options']} from file #{environment.keys[0]}.rb\n"
|
10
|
+
@environments << environment.keys[0]
|
11
|
+
end
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
@@ -1,33 +1,35 @@
|
|
1
1
|
class Spiceweasel::NodeList
|
2
|
-
def initialize(nodes, cookbook_list, environment_list, role_list)
|
2
|
+
def initialize(nodes, cookbook_list, environment_list, role_list, options = {})
|
3
3
|
nodes ||= []
|
4
4
|
@create = @delete = ''
|
5
5
|
|
6
|
-
@delete += "knife node bulk_delete .* -y\n"
|
7
|
-
nodes
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
#create the instances
|
20
|
-
count.to_i.times do
|
21
|
-
@create += "knife #{provider[0]} server create #{node[node.keys[0]][1]}"
|
22
|
-
if run_list.length > 0
|
23
|
-
@create += " -r '#{node[node.keys[0]][0].gsub(/ /,',')}'\n"
|
6
|
+
@delete += "knife node#{options['knife_options']} bulk_delete .* -y\n"
|
7
|
+
if nodes
|
8
|
+
nodes.each do |node|
|
9
|
+
STDOUT.puts "DEBUG: node: #{node.keys[0]}" if DEBUG
|
10
|
+
run_list = node[node.keys[0]][0].gsub(/ /,',').split(',')
|
11
|
+
STDOUT.puts "DEBUG: node run_list: #{run_list}" if DEBUG
|
12
|
+
Spiceweasel::RunList.new(run_list).validate(cookbook_list, environment_list, role_list)
|
13
|
+
#provider support
|
14
|
+
if node.keys[0].start_with?("bluebox","ec2","openstack","rackspace","slicehost","terremark")
|
15
|
+
provider = node.keys[0].split()
|
16
|
+
count = 1
|
17
|
+
if (provider.length == 2)
|
18
|
+
count = provider[1]
|
24
19
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
20
|
+
#create the instances
|
21
|
+
count.to_i.times do
|
22
|
+
@create += "knife #{provider[0]}#{options['knife_options']} server create #{node[node.keys[0]][1]}"
|
23
|
+
if run_list.length > 0
|
24
|
+
@create += " -r '#{node[node.keys[0]][0].gsub(/ /,',')}'\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
else #multinode support
|
28
|
+
node.keys[0].split.each do |server|
|
29
|
+
@create += "knife bootstrap#{options['knife_options']} #{server} #{node[node.keys[0]][1]}"
|
30
|
+
if run_list.length > 0
|
31
|
+
@create += " -r '#{node[node.keys[0]][0].gsub(/ /,',')}'\n"
|
32
|
+
end
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
class Spiceweasel::RoleList
|
2
|
-
def initialize(roles = [])
|
2
|
+
def initialize(roles = [], options = {})
|
3
3
|
@create = @delete = ''
|
4
4
|
@roles = []
|
5
|
-
roles
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
if roles
|
6
|
+
roles.each do |role|
|
7
|
+
STDOUT.puts "DEBUG: role: #{role.keys[0]}" if DEBUG
|
8
|
+
@delete += "knife role#{options['knife_options']} delete #{role.keys[0]} -y\n"
|
9
|
+
@create += "knife role#{options['knife_options']} from file #{role.keys[0]}.rb\n"
|
10
|
+
@roles << role.keys[0]
|
11
|
+
end
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
data/lib/spiceweasel/version.rb
CHANGED
metadata
CHANGED
@@ -1,91 +1,72 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: spiceweasel
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 8
|
9
|
-
- 1
|
10
|
-
version: 0.8.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.2
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Matt Ray
|
14
9
|
- Elliot Crosby-McCullough
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
date: 2011-08-11 00:00:00 -05:00
|
13
|
+
date: 2011-10-28 00:00:00.000000000 -05:00
|
20
14
|
default_executable:
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
23
17
|
name: chef
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
requirement: &2160839960 !ruby/object:Gem::Requirement
|
26
19
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
|
31
|
-
segments:
|
32
|
-
- 0
|
33
|
-
version: "0"
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
34
24
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: json
|
38
25
|
prerelease: false
|
39
|
-
|
26
|
+
version_requirements: *2160839960
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: &2160839480 !ruby/object:Gem::Requirement
|
40
30
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
segments:
|
46
|
-
- 0
|
47
|
-
version: "0"
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
48
35
|
type: :runtime
|
49
|
-
version_requirements: *id002
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: mixlib-cli
|
52
36
|
prerelease: false
|
53
|
-
|
37
|
+
version_requirements: *2160839480
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: mixlib-cli
|
40
|
+
requirement: &2160839000 !ruby/object:Gem::Requirement
|
54
41
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
segments:
|
60
|
-
- 0
|
61
|
-
version: "0"
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
62
46
|
type: :runtime
|
63
|
-
version_requirements: *id003
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
name: rspec
|
66
47
|
prerelease: false
|
67
|
-
|
48
|
+
version_requirements: *2160839000
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rspec
|
51
|
+
requirement: &2160838480 !ruby/object:Gem::Requirement
|
68
52
|
none: false
|
69
|
-
requirements:
|
70
|
-
- -
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
|
73
|
-
segments:
|
74
|
-
- 0
|
75
|
-
version: "0"
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
76
57
|
type: :development
|
77
|
-
|
78
|
-
|
79
|
-
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *2160838480
|
60
|
+
description: This provides a CLI for generating knife commands to build Chef-managed
|
61
|
+
infrastructure from a simple YAML file.
|
62
|
+
email:
|
80
63
|
- matt@opscode.com
|
81
64
|
- elliot.cm@gmail.com
|
82
|
-
executables:
|
65
|
+
executables:
|
83
66
|
- spiceweasel
|
84
67
|
extensions: []
|
85
|
-
|
86
68
|
extra_rdoc_files: []
|
87
|
-
|
88
|
-
files:
|
69
|
+
files:
|
89
70
|
- bin/spiceweasel
|
90
71
|
- lib/spiceweasel/cli.rb
|
91
72
|
- lib/spiceweasel/cookbook_list.rb
|
@@ -101,36 +82,27 @@ files:
|
|
101
82
|
has_rdoc: true
|
102
83
|
homepage: http://github.com/mattray/spiceweasel
|
103
84
|
licenses: []
|
104
|
-
|
105
85
|
post_install_message:
|
106
86
|
rdoc_options: []
|
107
|
-
|
108
|
-
require_paths:
|
87
|
+
require_paths:
|
109
88
|
- lib
|
110
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
90
|
none: false
|
112
|
-
requirements:
|
113
|
-
- -
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
|
116
|
-
|
117
|
-
- 0
|
118
|
-
version: "0"
|
119
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
96
|
none: false
|
121
|
-
requirements:
|
122
|
-
- -
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
|
125
|
-
segments:
|
126
|
-
- 0
|
127
|
-
version: "0"
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
128
101
|
requirements: []
|
129
|
-
|
130
102
|
rubyforge_project: spiceweasel
|
131
|
-
rubygems_version: 1.
|
103
|
+
rubygems_version: 1.6.2
|
132
104
|
signing_key:
|
133
105
|
specification_version: 3
|
134
106
|
summary: CLI for generating Chef knife commands from a simple YAML file.
|
135
|
-
test_files:
|
107
|
+
test_files:
|
136
108
|
- spec/bin/spiceweasel_spec.rb
|