blender-chef 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/README.md +65 -0
- data/blender-chef.gemspec +3 -2
- data/lib/blender/discoveries/chef.rb +17 -35
- data/lib/chef/knife/blender.rb +165 -0
- data/spec/blender/discoveries/chef_spec.rb +19 -22
- data/spec/blender/knife_spec.rb +29 -0
- data/spec/spec_helper.rb +42 -0
- metadata +22 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0678c7aeb1d0d4a93bc0a1cf94807248d3860b7a
|
4
|
+
data.tar.gz: 6a3369819b869119d59021f45d65af65ff380858
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a931c089da34be8cc2811ee8f1a7b0c266307967f0ab8932c31476bebe1e1e9e4480247c3d7faefe17644d152495695fb870d3d983f379be3ce0a24ebc16ab92
|
7
|
+
data.tar.gz: ac3bb2c4e26e32671b44120bd60b0c98923149631c9673f06482d3a42dac2560a23ae46625dd84cbcfbcad466887a3bf12632519f0d94a26749b7609071f8a16
|
data/.travis.yml
CHANGED
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# Blender-Chef
|
2
|
+
|
3
|
+
A [chef](https://www.chef.io/chef) based host discovery plugin for [Blender](https://github.com/PagerDuty/blender)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```sh
|
8
|
+
gem install blender-chef
|
9
|
+
```
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
With blender-chef, host list for `blender` jobs can be automatically
|
13
|
+
fetched from Chef server. Following is an example of dynamically obtaining
|
14
|
+
all servers with `db` role, and enlisting their `iptables` rule.
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
require 'belnder/chef'
|
18
|
+
config(:chef, chef_sever_url: 'https://foo.bar.com', node_name: 'admin', client_key: 'admin.pem')
|
19
|
+
members(search(:chef, 'roles:db'))
|
20
|
+
ssh_task 'sudo iptables -L'
|
21
|
+
```
|
22
|
+
Aany valid chef search can be used. You can pass the `node_name`, `chef_server_url` and `client_key` for chef server config.
|
23
|
+
```ruby
|
24
|
+
config(:chef, node_name: 'admin', client_key: 'admin.pem', chef_server_url: 'https://example.com')
|
25
|
+
members(search(:chef, 'ec2_local_ipv4:10.13.12.11'))
|
26
|
+
ssh_task 'sudo iptables -L'
|
27
|
+
```
|
28
|
+
Alternatively, you can also use a config file lile `client.rb` or `knife.rb`
|
29
|
+
```ruby
|
30
|
+
config(:chef, config_file: '/etc/chef/client.rb')
|
31
|
+
members(search(:chef, 'roles:db'))
|
32
|
+
```
|
33
|
+
|
34
|
+
By default `blender-chef` will pass the FQDN of chef nodes as member list,
|
35
|
+
in this case as ssh targets. This can be customized by passing the attribute
|
36
|
+
option.
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
config(:chef, node_name: 'admin', client_key: 'admin.pem')
|
40
|
+
members(search(:chef, 'roles:db', attribute: 'ec2_public_ipv4'))
|
41
|
+
```
|
42
|
+
|
43
|
+
|
44
|
+
## Supported ruby versions
|
45
|
+
|
46
|
+
Blender-chef uses Chef 12 (for partial search). For chef 11, use 0.0.1 version of blender-chef.
|
47
|
+
|
48
|
+
Blender-chef currently support the following MRI versions:
|
49
|
+
|
50
|
+
* *Ruby 1.9.3*
|
51
|
+
* *Ruby 2.1.0*
|
52
|
+
* *Ruby 2.1.2*
|
53
|
+
|
54
|
+
## License
|
55
|
+
|
56
|
+
[Apache 2](http://www.apache.org/licenses/LICENSE-2.0)
|
57
|
+
|
58
|
+
## Contributing
|
59
|
+
|
60
|
+
1. Fork it ( https://github.com/PagerDuty/blender-chef/fork )
|
61
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
62
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
63
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
64
|
+
5. Create a new Pull Request
|
65
|
+
```
|
data/blender-chef.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'blender-chef'
|
7
|
-
spec.version = '0.0
|
7
|
+
spec.version = '0.1.0'
|
8
8
|
spec.authors = ['Ranjib Dey']
|
9
9
|
spec.email = ['ranjib@pagerduty.com']
|
10
10
|
spec.summary = %q{Chef search based host discovery for blender}
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.require_paths = ['lib']
|
18
18
|
|
19
19
|
spec.add_dependency 'pd-blender'
|
20
|
-
spec.add_dependency 'chef'
|
20
|
+
spec.add_dependency 'chef', '>= 12.0.0'
|
21
21
|
|
22
22
|
spec.add_development_dependency 'bundler'
|
23
23
|
spec.add_development_dependency 'rake'
|
@@ -25,4 +25,5 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency 'rubocop'
|
26
26
|
spec.add_development_dependency 'simplecov'
|
27
27
|
spec.add_development_dependency 'yard'
|
28
|
+
spec.add_development_dependency 'fauxhai'
|
28
29
|
end
|
@@ -26,43 +26,25 @@ module Blender
|
|
26
26
|
@options = options
|
27
27
|
end
|
28
28
|
|
29
|
-
def search(
|
30
|
-
if options[:config_file]
|
31
|
-
::Chef::Config.from_file options[:config_file]
|
32
|
-
end
|
33
|
-
if options[:node_name]
|
34
|
-
::Chef::Config[:node_name] = options[:node_name]
|
35
|
-
end
|
36
|
-
if options[:client_key]
|
37
|
-
::Chef::Config[:client_key] = options[:client_key]
|
38
|
-
end
|
39
|
-
if options[:chef_server_url]
|
40
|
-
::Chef::Config[:chef_server_url] = options[:chef_server_url]
|
41
|
-
end
|
29
|
+
def search(opts = {})
|
42
30
|
attr = options[:attribute] || 'fqdn'
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
if data.nil?
|
52
|
-
nil # don't get no method error on nil
|
53
|
-
elsif data.respond_to?(attr.to_sym)
|
54
|
-
data = data.send(attr.to_sym)
|
55
|
-
elsif data.respond_to?(:[])
|
56
|
-
data = data[attr]
|
57
|
-
else
|
58
|
-
data = begin
|
59
|
-
data.send(attr.to_sym)
|
60
|
-
rescue NoMethodError
|
61
|
-
nil
|
62
|
-
end
|
63
|
-
end
|
31
|
+
case opts
|
32
|
+
when String
|
33
|
+
search_term = opts
|
34
|
+
when Hash
|
35
|
+
search_term = opts[:search_term]
|
36
|
+
attr = opts[:attribute] if opts.key?(:attribute)
|
37
|
+
else
|
38
|
+
raise ArgumentError, "Invalid argument type #{opts.class}"
|
64
39
|
end
|
65
|
-
|
40
|
+
search_term ||= '*:*'
|
41
|
+
::Chef::Config.from_file(options[:config_file]) if options[:config_file]
|
42
|
+
::Chef::Config[:node_name] = options[:node_name] if options[:node_name]
|
43
|
+
::Chef::Config[:client_key] = options[:client_key] if options[:client_key]
|
44
|
+
::Chef::Config[:chef_server_url] = options[:chef_server_url] if options[:chef_server_url]
|
45
|
+
q = ::Chef::Search::Query.new
|
46
|
+
res = q.search(:node, search_term, filter_result: {attribute: attr.split('.')})
|
47
|
+
res.first.collect{|node_data| node_data['data']['attribute']}
|
66
48
|
end
|
67
49
|
end
|
68
50
|
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Ranjib Dey (<ranjib@pagerduty.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 PagerDuty, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'chef/knife'
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
class Knife
|
23
|
+
class Blend < Chef::Knife
|
24
|
+
|
25
|
+
banner 'knife blend FILE (options)'
|
26
|
+
|
27
|
+
deps do
|
28
|
+
require 'blender'
|
29
|
+
require 'blender/chef'
|
30
|
+
end
|
31
|
+
|
32
|
+
option :search,
|
33
|
+
short: '-s SEARCH_TERM',
|
34
|
+
long: '--search SEARCH_TERM',
|
35
|
+
description: 'Chef search query',
|
36
|
+
default: '*:*'
|
37
|
+
|
38
|
+
option :attribute,
|
39
|
+
short: '-a ATTRIBUTE',
|
40
|
+
long: '--attribute ATTRIBUTE',
|
41
|
+
description: 'Node attribute that will used as SSH hostname',
|
42
|
+
default: 'fqdn'
|
43
|
+
|
44
|
+
option :blender_config,
|
45
|
+
default: nil,
|
46
|
+
long: :'--blender-config CONFIG_FILE',
|
47
|
+
description: 'Provide blender configuration via json file'
|
48
|
+
|
49
|
+
option :noop,
|
50
|
+
default: false,
|
51
|
+
boolean: true,
|
52
|
+
short: '-n',
|
53
|
+
long: '--noop',
|
54
|
+
description: 'no-op aka dry-run mode, run blender without executing jobs'
|
55
|
+
|
56
|
+
option :quiet,
|
57
|
+
default: false,
|
58
|
+
boolean: true,
|
59
|
+
short: '-q',
|
60
|
+
description: 'Quiet mode. Disable printing running job details'
|
61
|
+
|
62
|
+
option :user,
|
63
|
+
default: ENV['USER'],
|
64
|
+
short: '-u USER',
|
65
|
+
long: '--user USER',
|
66
|
+
description: 'SSH User'
|
67
|
+
|
68
|
+
option :password,
|
69
|
+
short: '-p PASSWORD',
|
70
|
+
long: '--password PASSWORD',
|
71
|
+
description: 'SSH password'
|
72
|
+
|
73
|
+
option :quiet,
|
74
|
+
default: false,
|
75
|
+
boolean: true,
|
76
|
+
short: '-q',
|
77
|
+
description: 'Quiet mode. Disable printing running job details'
|
78
|
+
|
79
|
+
option :stream,
|
80
|
+
default: true,
|
81
|
+
boolean: true,
|
82
|
+
long: '--stream',
|
83
|
+
description: 'Stream STDOUT of commands(works only if quiet mode is not used)'
|
84
|
+
|
85
|
+
option :strategy,
|
86
|
+
default: :default,
|
87
|
+
long: '--strategy STRATEGY',
|
88
|
+
description: 'Strategy of execution (default, per_host or per_task)',
|
89
|
+
proc: lambda{|strategy| strategy.to_sym}
|
90
|
+
|
91
|
+
option :identity_file,
|
92
|
+
short: '-i IDENTITY_FILE',
|
93
|
+
long: '--identity-file IDENTITY_FILE',
|
94
|
+
description: 'Identity file for SSH authentication'
|
95
|
+
|
96
|
+
option :recipe_mode,
|
97
|
+
long: '--recipe-mode',
|
98
|
+
description: 'Treat input files as chef recipe and compose blender tasks to execute them (scp + ssh)',
|
99
|
+
boolean: true,
|
100
|
+
default: false
|
101
|
+
|
102
|
+
option :recipe_mode,
|
103
|
+
long: '--recipe-mode',
|
104
|
+
description: 'Treat input files as chef recipe and compose blender tasks to execute them (scp + ssh)',
|
105
|
+
boolean: true,
|
106
|
+
default: false
|
107
|
+
|
108
|
+
option :chef_apply,
|
109
|
+
long: '--chef-apply',
|
110
|
+
short: '-A',
|
111
|
+
description: 'chef-apply command to be used (effective only in recipe mode)',
|
112
|
+
default: 'chef-apply'
|
113
|
+
|
114
|
+
def run
|
115
|
+
ssh_options = {
|
116
|
+
user: config[:user],
|
117
|
+
stdout: $stdout
|
118
|
+
}
|
119
|
+
ssh_options[:stdout] = $stdout if config[:stream]
|
120
|
+
if config[:password]
|
121
|
+
ssh_options[:password] = config[:password]
|
122
|
+
elsif config[:prompt]
|
123
|
+
ssh_options[:password] = ui.ask('SSH password: ') {|q|q.echo = false}
|
124
|
+
end
|
125
|
+
if config[:identity_file]
|
126
|
+
ssh_options[:keys] = Array(config[:identity_file])
|
127
|
+
end
|
128
|
+
scheduler_options = {
|
129
|
+
config_file: config[:blender_config],
|
130
|
+
no_doc: config[:quiet]
|
131
|
+
}
|
132
|
+
discovery_options = {
|
133
|
+
attribute: config[:attribute]
|
134
|
+
}
|
135
|
+
Blender::Configuration[:noop] = config[:noop]
|
136
|
+
members = Blender::Discovery::Chef.new(discovery_options).search(config[:search])
|
137
|
+
|
138
|
+
@name_args.each do |file|
|
139
|
+
if config[:recipe_mode]
|
140
|
+
remote_path = File.join('/tmp', SecureRandom.hex(10))
|
141
|
+
Blender.blend(options[:file], scheduler_options) do |scheduler|
|
142
|
+
scheduler.strategy(config[:strategy])
|
143
|
+
scheduler.config(:ssh, ssh_options)
|
144
|
+
scheduler.config(:scp, ssh_options)
|
145
|
+
scheduler.members(members)
|
146
|
+
scheduler.scp_upload(remote_path) do
|
147
|
+
from file
|
148
|
+
end
|
149
|
+
scheduler.ssh_task "#{config[:chef_apply]} #{remote_path}"
|
150
|
+
scheduler.ssh_task "rm #{remote_path}"
|
151
|
+
end
|
152
|
+
else
|
153
|
+
job = File.read(file)
|
154
|
+
Blender.blend(options[:file], scheduler_options) do |scheduler|
|
155
|
+
scheduler.strategy(config[:strategy])
|
156
|
+
scheduler.config(:ssh, ssh_options)
|
157
|
+
scheduler.members(members)
|
158
|
+
scheduler.instance_eval(job, __FILE__, __LINE__)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -4,28 +4,25 @@ require 'blender/discoveries/chef'
|
|
4
4
|
describe Blender::Discovery::Chef do
|
5
5
|
let(:discovery){described_class.new}
|
6
6
|
it '#search' do
|
7
|
-
|
8
|
-
node = Chef::Node.new
|
9
|
-
node.set['fqdn'] = 'a'
|
10
|
-
expect(query).to receive(:search).with(:node, '*:*').and_return([[node]])
|
11
|
-
expect(Chef::Search::Query).to receive(:new).and_return(query)
|
12
|
-
expect(discovery.search).to eq(['a'])
|
7
|
+
expect(discovery.search.size).to be(10)
|
13
8
|
end
|
14
|
-
|
15
|
-
disco
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
9
|
+
context '#against chef zero' do
|
10
|
+
let(:disco) do
|
11
|
+
described_class.new(
|
12
|
+
chef_server_url: 'http://localhost:8889',
|
13
|
+
node_name: 'admin',
|
14
|
+
client_key: SpecHelper.client_key.path,
|
15
|
+
attribute: 'name'
|
16
|
+
)
|
17
|
+
end
|
18
|
+
it '#search without options' do
|
19
|
+
expect(disco.search('name:node-1')).to eq(['node-1'])
|
20
|
+
end
|
21
|
+
it '#search with role based predicate' do
|
22
|
+
expect(disco.search('roles:even')).to eq(["node-1", "node-3", "node-5", "node-7", "node-9"])
|
23
|
+
end
|
24
|
+
it '#search with attribute predicate' do
|
25
|
+
expect(disco.search(search_term: 'roles:even', attribute: 'ipaddress').size).to eq(5)
|
26
|
+
end
|
30
27
|
end
|
31
28
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'chef/knife/blender'
|
4
|
+
|
5
|
+
describe Chef::Knife::Blend do
|
6
|
+
before(:each) do
|
7
|
+
Chef::Knife::Blend.load_deps
|
8
|
+
@knife = Chef::Knife::Blend.new
|
9
|
+
@knife.config[:user] = 'test-user'
|
10
|
+
@knife.config[:passsword] = 'test-password'
|
11
|
+
@knife.config[:search] = 'roles:db'
|
12
|
+
@knife.config[:strategy] = :default
|
13
|
+
@knife.name_args = ["job.rb"]
|
14
|
+
end
|
15
|
+
it '#non recipe mode' do
|
16
|
+
disco = double(Blender::Discovery::Chef)
|
17
|
+
expect(Blender::Discovery::Chef).to receive(:new).and_return(disco)
|
18
|
+
expect(disco).to receive(:search).and_return(['host1', 'host2'])
|
19
|
+
expect(File).to receive(:read).with('job.rb').and_return('')
|
20
|
+
@knife.run
|
21
|
+
end
|
22
|
+
it '#recipe mode' do
|
23
|
+
@knife.config[:recipe_mode] = true
|
24
|
+
disco = double(Blender::Discovery::Chef)
|
25
|
+
expect(Blender::Discovery::Chef).to receive(:new).and_return(disco)
|
26
|
+
expect(disco).to receive(:search).and_return([])
|
27
|
+
@knife.run
|
28
|
+
end
|
29
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,50 @@
|
|
1
1
|
require 'blender'
|
2
|
+
require 'chef_zero/server'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'chef/node'
|
5
|
+
require 'tempfile'
|
6
|
+
require 'fauxhai'
|
7
|
+
|
8
|
+
module SpecHelper
|
9
|
+
extend self
|
10
|
+
def server
|
11
|
+
$server ||= ChefZero::Server.new
|
12
|
+
end
|
13
|
+
def client_key
|
14
|
+
$client_key ||= Tempfile.new('client.pem')
|
15
|
+
end
|
16
|
+
def setup
|
17
|
+
server.start_background
|
18
|
+
Chef::Config[:chef_server_url] = 'http://127.0.0.1:8889'
|
19
|
+
Chef::Config[:node_name] = 'admin'
|
20
|
+
Chef::Config[:client_key] = client_key.path
|
21
|
+
client_key.write(server.gen_key_pair.first)
|
22
|
+
client_key.close
|
23
|
+
10.times do |n|
|
24
|
+
node = Chef::Node.new
|
25
|
+
node.name('node-'+ (n+1).to_s)
|
26
|
+
node.set['roles'] = n.odd? ? ['odd'] : ['even']
|
27
|
+
node.consume_attributes(
|
28
|
+
Fauxhai.mock(platform: 'ubuntu', version: '14.04').data
|
29
|
+
)
|
30
|
+
node.save
|
31
|
+
end
|
32
|
+
end
|
33
|
+
def cleanse
|
34
|
+
client_key.unlink
|
35
|
+
server.stop
|
36
|
+
end
|
37
|
+
end
|
2
38
|
|
3
39
|
RSpec.configure do |config|
|
4
40
|
config.mock_with :rspec do |mocks|
|
5
41
|
mocks.verify_doubled_constant_names = true
|
6
42
|
end
|
43
|
+
config.before(:suite) do
|
44
|
+
SpecHelper.setup
|
45
|
+
end
|
46
|
+
config.after(:suite) do
|
47
|
+
SpecHelper.cleanse
|
48
|
+
end
|
7
49
|
config.backtrace_exclusion_patterns = []
|
8
50
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blender-chef
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ranjib Dey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pd-blender
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 12.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 12.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: fauxhai
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
125
139
|
description: Discover hosts using chef search for blender
|
126
140
|
email:
|
127
141
|
- ranjib@pagerduty.com
|
@@ -132,11 +146,14 @@ files:
|
|
132
146
|
- ".gitignore"
|
133
147
|
- ".travis.yml"
|
134
148
|
- Gemfile
|
149
|
+
- README.md
|
135
150
|
- Rakefile
|
136
151
|
- blender-chef.gemspec
|
137
152
|
- lib/blender/chef.rb
|
138
153
|
- lib/blender/discoveries/chef.rb
|
154
|
+
- lib/chef/knife/blender.rb
|
139
155
|
- spec/blender/discoveries/chef_spec.rb
|
156
|
+
- spec/blender/knife_spec.rb
|
140
157
|
- spec/spec_helper.rb
|
141
158
|
homepage: http://github.com/PagerDuty/blender-chef
|
142
159
|
licenses:
|
@@ -164,5 +181,6 @@ specification_version: 4
|
|
164
181
|
summary: Chef search based host discovery for blender
|
165
182
|
test_files:
|
166
183
|
- spec/blender/discoveries/chef_spec.rb
|
184
|
+
- spec/blender/knife_spec.rb
|
167
185
|
- spec/spec_helper.rb
|
168
186
|
has_rdoc:
|