sous-chef 0.0.6 → 0.0.7
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/Gemfile.lock +5 -5
- data/README.md +16 -11
- data/lib/helpers/node_helpers.rb +2 -1
- data/lib/helpers/node_task_helpers.rb +77 -0
- data/lib/sous-chef/collection.rb +2 -0
- data/lib/sous-chef/task_builder.rb +14 -1
- data/lib/sous-chef.rb +3 -2
- data/sous-chef.gemspec +4 -5
- data/spec/helpers/node_task_helpers_spec.rb +43 -0
- data/spec/sous-chef/tasks_spec.rb +20 -0
- metadata +11 -11
- data/lib/sous-chef/node_tasks.rb +0 -47
- data/spec/sous-chef/node_tasks_spec.rb +0 -20
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sous-chef (0.0.
|
4
|
+
sous-chef (0.0.7)
|
5
5
|
knife-solo (~> 0.1.0)
|
6
|
-
rake (~> 10.0.
|
6
|
+
rake (~> 10.0.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: http://rubygems.org/
|
@@ -42,7 +42,7 @@ GEM
|
|
42
42
|
chef (>= 0.10)
|
43
43
|
highline
|
44
44
|
thor (~> 0.15)
|
45
|
-
mime-types (1.
|
45
|
+
mime-types (1.20.1)
|
46
46
|
mixlib-authentication (1.3.0)
|
47
47
|
mixlib-log
|
48
48
|
mixlib-cli (1.3.0)
|
@@ -77,7 +77,7 @@ GEM
|
|
77
77
|
diff-lcs (~> 1.1.3)
|
78
78
|
rspec-mocks (2.12.1)
|
79
79
|
systemu (2.5.2)
|
80
|
-
thor (0.
|
80
|
+
thor (0.17.0)
|
81
81
|
treetop (1.4.12)
|
82
82
|
polyglot
|
83
83
|
polyglot (>= 0.3.1)
|
@@ -89,6 +89,6 @@ PLATFORMS
|
|
89
89
|
|
90
90
|
DEPENDENCIES
|
91
91
|
bundler (~> 1.1)
|
92
|
-
rake (~> 10.0.
|
92
|
+
rake (~> 10.0.0)
|
93
93
|
rspec (~> 2.12.0)
|
94
94
|
sous-chef!
|
data/README.md
CHANGED
@@ -2,22 +2,31 @@
|
|
2
2
|
|
3
3
|
Manage [knife-solo](http://matschaffer.github.com/knife-solo/) nodes.
|
4
4
|
|
5
|
-
##
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
Simply ensure the gem is installed using:
|
8
|
+
|
9
|
+
gem install sous-chef
|
10
|
+
|
11
|
+
Or add this to your Gemfile if you use bundler:
|
12
|
+
|
13
|
+
gem 'sous-chef'
|
6
14
|
|
7
|
-
|
15
|
+
And add the following to your `Rakefile`:
|
8
16
|
|
9
17
|
```ruby
|
10
18
|
require 'sous-chef'
|
11
19
|
```
|
12
20
|
|
13
|
-
|
14
|
-
|
21
|
+
Run `rake sous_chef:init` to place a sample `nodes.yml` under `nodes/nodes.yml`
|
22
|
+
|
23
|
+
Run `rake -T` to display nodes and commands defined in `nodes/nodes.yml`
|
15
24
|
|
16
25
|
## Configure
|
17
26
|
|
18
|
-
|
19
|
-
|
20
|
-
|
27
|
+
Node configuration is done in `nodes/nodes.yml`. You can namespace your nodes
|
28
|
+
however you want. You can run multiple tasks in parallel using the `:all:`
|
29
|
+
namespace Example `nodes.yml`:
|
21
30
|
|
22
31
|
```yaml
|
23
32
|
# Format:
|
@@ -62,10 +71,6 @@ vagrant:
|
|
62
71
|
ForwardAgent: "yes"
|
63
72
|
```
|
64
73
|
|
65
|
-
## Usage
|
66
|
-
|
67
|
-
`rake -T` for a full list of tasks provided:
|
68
|
-
|
69
74
|
## Contributing
|
70
75
|
|
71
76
|
1. Fork it
|
data/lib/helpers/node_helpers.rb
CHANGED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
module SousChef::NodeTaskHelpers
|
4
|
+
include Rake::DSL
|
5
|
+
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def build_node_task(node)
|
9
|
+
namespace node.name do
|
10
|
+
prepare_task(node)
|
11
|
+
cook_task(node)
|
12
|
+
bootstrap_task(node)
|
13
|
+
clean_task(node)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def clean_task(node)
|
18
|
+
desc "Run knife solo clean for #{node.name}"
|
19
|
+
task :clean do
|
20
|
+
run_knife 'clean', node
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def cook_task(node)
|
25
|
+
desc "Run knife solo cook for #{node.name}"
|
26
|
+
task :cook do
|
27
|
+
run_knife 'cook', node
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def bootstrap_task(node)
|
32
|
+
desc "Run knife solo bootstrap for #{node.name}"
|
33
|
+
task :bootstrap do
|
34
|
+
run_knife 'bootstrap', node
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def prepare_task(node)
|
39
|
+
desc "Run knife solo prepare for #{node.name}"
|
40
|
+
task :prepare do
|
41
|
+
run_knife 'prepare', node
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def batch_tasks(name, tasks)
|
46
|
+
task_names = tasks.map(&:name)
|
47
|
+
|
48
|
+
desc "Run knife solo prepare for all #{name} nodes"
|
49
|
+
multitask :prepare => filter_tasks(task_names, 'prepare')
|
50
|
+
|
51
|
+
desc "Run knife solo cook for all #{name} nodes"
|
52
|
+
multitask :cook => filter_tasks(task_names, 'cook')
|
53
|
+
|
54
|
+
desc "Run knife solo bootstrap for all #{name} nodes"
|
55
|
+
multitask :bootstrap => filter_tasks(task_names, 'bootstrap')
|
56
|
+
|
57
|
+
desc "Run knife solo clean for all #{name} nodes"
|
58
|
+
multitask :clean => filter_tasks(task_names, 'clean')
|
59
|
+
end
|
60
|
+
|
61
|
+
def filter_tasks(tasks_names, desired_task)
|
62
|
+
tasks_names.clone.keep_if { |task_name| task_name.include? desired_task }
|
63
|
+
end
|
64
|
+
|
65
|
+
def run(command)
|
66
|
+
puts "Running: #{command}"
|
67
|
+
system command
|
68
|
+
raise "Failure! #{$?}" if $? != 0
|
69
|
+
end
|
70
|
+
|
71
|
+
def run_knife(command, node)
|
72
|
+
options = "-F #{node.ssh_config_path} #{node.hostname}"
|
73
|
+
options = "#{options} -N #{node.name} #{node.config}" unless %w[clean].include? command
|
74
|
+
run "knife solo #{command} #{options}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
data/lib/sous-chef/collection.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class SousChef::TaskBuilder
|
2
|
-
include SousChef::
|
2
|
+
include SousChef::NodeTaskHelpers
|
3
3
|
include SousChef::NodeHelpers
|
4
4
|
|
5
5
|
def initialize(nodes)
|
@@ -8,6 +8,19 @@ class SousChef::TaskBuilder
|
|
8
8
|
|
9
9
|
def build_tasks
|
10
10
|
build_namespace(@nodes)
|
11
|
+
build_batch_tasks(@nodes)
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_batch_tasks(collection)
|
15
|
+
collection.each do |name, collection|
|
16
|
+
next if node?(collection)
|
17
|
+
namespace name do |ns|
|
18
|
+
namespace :all do
|
19
|
+
batch_tasks(name, ns.tasks)
|
20
|
+
end
|
21
|
+
build_batch_tasks(collection)
|
22
|
+
end
|
23
|
+
end
|
11
24
|
end
|
12
25
|
|
13
26
|
def build_namespace(collection)
|
data/lib/sous-chef.rb
CHANGED
@@ -3,6 +3,8 @@ module SousChef
|
|
3
3
|
CONFIG_TEMPLATE = File.expand_path(File.join(File.dirname(__FILE__), 'templates', 'nodes.example.yml'))
|
4
4
|
CONFIG_FILE = File.join(Dir.pwd, "nodes", "nodes.yml")
|
5
5
|
|
6
|
+
module_function
|
7
|
+
|
6
8
|
def config_file_location
|
7
9
|
CONFIG_FILE
|
8
10
|
end
|
@@ -20,12 +22,11 @@ module SousChef
|
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
module_function :create_config, :config_file_location, :config_template_location
|
24
25
|
end
|
25
26
|
|
26
27
|
require 'helpers/node_helpers'
|
28
|
+
require 'helpers/node_task_helpers'
|
27
29
|
require 'sous-chef/parser'
|
28
|
-
require 'sous-chef/node_tasks'
|
29
30
|
require 'sous-chef/node'
|
30
31
|
require 'sous-chef/collection'
|
31
32
|
require 'sous-chef/task_builder'
|
data/sous-chef.gemspec
CHANGED
@@ -6,9 +6,9 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.email = "shaun@substantail.com"
|
7
7
|
|
8
8
|
s.name = 'sous-chef'
|
9
|
-
s.version = "0.0.
|
9
|
+
s.version = "0.0.7"
|
10
10
|
s.description = %q{Manage knife-solo nodes}
|
11
|
-
s.summary = %q{
|
11
|
+
s.summary = %q{Rake tasks for managing knife-solo nodes by environment. Run knife solo
|
12
12
|
commands on one or multiple nodes.}
|
13
13
|
s.homepage = %q{http://github.com/substantial/sous-chef}
|
14
14
|
s.license = "MIT"
|
@@ -20,11 +20,10 @@ commands on one or multiple nodes.}
|
|
20
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
|
23
|
-
s.add_runtime_dependency "rake", "~> 10.0.
|
23
|
+
s.add_runtime_dependency "rake", "~> 10.0.0"
|
24
24
|
s.add_development_dependency "rspec", "~> 2.12.0"
|
25
|
-
s.add_development_dependency "rake", "~> 10.0.
|
25
|
+
s.add_development_dependency "rake", "~> 10.0.0"
|
26
26
|
s.add_development_dependency "bundler", "~> 1.1"
|
27
27
|
s.add_dependency "knife-solo", "~> 0.1.0"
|
28
|
-
|
29
28
|
end
|
30
29
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SousChef::NodeTaskHelpers do
|
4
|
+
before do
|
5
|
+
SousChef::NodeTaskHelpers.stub(:run)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#run_knife" do
|
9
|
+
let(:node) { double('node') }
|
10
|
+
|
11
|
+
before do
|
12
|
+
node.stub(name: 'foo')
|
13
|
+
node.stub(hostname: 'node_hostname')
|
14
|
+
node.stub(ssh_config_path: 'ssh_config_path')
|
15
|
+
node.stub(config: 'knife_solo_node_config')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should run knife solo command for given node" do
|
19
|
+
SousChef::NodeTaskHelpers.should_receive(:run).with("knife solo some_command -F ssh_config_path node_hostname -N foo knife_solo_node_config")
|
20
|
+
SousChef::NodeTaskHelpers.run_knife('some_command', node)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should not specify node config for #clean command" do
|
24
|
+
SousChef::NodeTaskHelpers.should_receive(:run).with("knife solo clean -F ssh_config_path node_hostname")
|
25
|
+
SousChef::NodeTaskHelpers.run_knife('clean', node)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#filter_tasks" do
|
30
|
+
it "should filter for tasks that have the action" do
|
31
|
+
tasks = %w[foo:bar:action foo:bar:baz]
|
32
|
+
SousChef::NodeTaskHelpers.filter_tasks(tasks, 'action').should include "foo:bar:action"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "shouldn't alter the input task list" do
|
36
|
+
tasks = %w[foo:bar:action foo:bar:baz]
|
37
|
+
tasks_clone = tasks.clone
|
38
|
+
SousChef::NodeTaskHelpers.filter_tasks(tasks, 'action').should include "foo:bar:action"
|
39
|
+
tasks.should == tasks_clone
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -1,5 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
def get_task(task_list, task_name)
|
4
|
+
task_list.select {|task| task.name == task_name}.first
|
5
|
+
end
|
6
|
+
|
3
7
|
describe "sous_chef.rake" do
|
4
8
|
before(:all) do
|
5
9
|
@rake = Rake::Application.new
|
@@ -37,5 +41,21 @@ describe "generated node tasks" do
|
|
37
41
|
it "should namespace nodes tasks" do
|
38
42
|
rake_tasks.should include "production:web:OtherAwesome:bootstrap"
|
39
43
|
end
|
44
|
+
|
45
|
+
it "should have #all task for namespaces" do
|
46
|
+
rake_tasks.should include "production:all:cook"
|
47
|
+
rake_tasks.should include "production:web:all:prepare"
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "generated namespace#all tasks" do
|
51
|
+
let(:multitasks) { multitasks = @rake.tasks.keep_if{ |task| task.is_a? Rake::MultiTask } }
|
52
|
+
|
53
|
+
%w[prepare cook clean bootstrap].each do |command|
|
54
|
+
it "should include all node tasks for #{command}" do
|
55
|
+
production_prepare_multitask = get_task(multitasks, "production:web:all:#{command}")
|
56
|
+
production_prepare_multitask.prerequisites.should =~ ["production:web:OtherAwesome:#{command}"]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
40
60
|
end
|
41
61
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sous-chef
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
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-02-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 10.0.
|
21
|
+
version: 10.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 10.0.
|
29
|
+
version: 10.0.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rspec
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 10.0.
|
53
|
+
version: 10.0.0
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 10.0.
|
61
|
+
version: 10.0.0
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: bundler
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -103,12 +103,12 @@ files:
|
|
103
103
|
- README.md
|
104
104
|
- Rakefile
|
105
105
|
- lib/helpers/node_helpers.rb
|
106
|
+
- lib/helpers/node_task_helpers.rb
|
106
107
|
- lib/sous-chef.rb
|
107
108
|
- lib/sous-chef/collection.rb
|
108
109
|
- lib/sous-chef/node.rb
|
109
110
|
- lib/sous-chef/node_builder.rb
|
110
111
|
- lib/sous-chef/node_manager.rb
|
111
|
-
- lib/sous-chef/node_tasks.rb
|
112
112
|
- lib/sous-chef/parser.rb
|
113
113
|
- lib/sous-chef/task_builder.rb
|
114
114
|
- lib/sous-chef/tasks.rb
|
@@ -117,11 +117,11 @@ files:
|
|
117
117
|
- lib/templates/nodes.example.yml
|
118
118
|
- sous-chef.gemspec
|
119
119
|
- spec/helpers/node_helpers_spec.rb
|
120
|
+
- spec/helpers/node_task_helpers_spec.rb
|
120
121
|
- spec/sous-chef/collection_spec.rb
|
121
122
|
- spec/sous-chef/node_builder_spec.rb
|
122
123
|
- spec/sous-chef/node_manager_spec.rb
|
123
124
|
- spec/sous-chef/node_spec.rb
|
124
|
-
- spec/sous-chef/node_tasks_spec.rb
|
125
125
|
- spec/sous-chef/parser_spec.rb
|
126
126
|
- spec/sous-chef/sous-chef_spec.rb
|
127
127
|
- spec/sous-chef/task_builder_spec.rb
|
@@ -153,15 +153,15 @@ rubyforge_project: sous-chef
|
|
153
153
|
rubygems_version: 1.8.24
|
154
154
|
signing_key:
|
155
155
|
specification_version: 3
|
156
|
-
summary:
|
157
|
-
multiple nodes.
|
156
|
+
summary: Rake tasks for managing knife-solo nodes by environment. Run knife solo commands
|
157
|
+
on one or multiple nodes.
|
158
158
|
test_files:
|
159
159
|
- spec/helpers/node_helpers_spec.rb
|
160
|
+
- spec/helpers/node_task_helpers_spec.rb
|
160
161
|
- spec/sous-chef/collection_spec.rb
|
161
162
|
- spec/sous-chef/node_builder_spec.rb
|
162
163
|
- spec/sous-chef/node_manager_spec.rb
|
163
164
|
- spec/sous-chef/node_spec.rb
|
164
|
-
- spec/sous-chef/node_tasks_spec.rb
|
165
165
|
- spec/sous-chef/parser_spec.rb
|
166
166
|
- spec/sous-chef/sous-chef_spec.rb
|
167
167
|
- spec/sous-chef/task_builder_spec.rb
|
data/lib/sous-chef/node_tasks.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
|
3
|
-
module SousChef::NodeTasks
|
4
|
-
include Rake::DSL
|
5
|
-
|
6
|
-
def build_node_task(node)
|
7
|
-
namespace node.name do
|
8
|
-
prepare_task(node)
|
9
|
-
cook_task(node)
|
10
|
-
bootstrap_task(node)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def cook_task(node)
|
15
|
-
desc "Run knife solo cook for #{node.name}"
|
16
|
-
task :cook do
|
17
|
-
run_knife 'cook', node
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def bootstrap_task(node)
|
22
|
-
desc "Run knife solo bootstrap for #{node.name}"
|
23
|
-
task :bootstrap do
|
24
|
-
run_knife 'bootstrap', node
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def prepare_task(node)
|
29
|
-
desc "Run knife solo prepare for #{node.name}"
|
30
|
-
task :prepare do
|
31
|
-
run_knife 'prepare', node
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def run(command)
|
36
|
-
puts "Running: #{command}"
|
37
|
-
system command
|
38
|
-
raise "Failure! #{$?}" if $? != 0
|
39
|
-
end
|
40
|
-
|
41
|
-
def run_knife(command, node)
|
42
|
-
run "knife solo #{command} -F #{node.ssh_config_path} #{node.hostname} -N #{node.name} #{node.config}"
|
43
|
-
end
|
44
|
-
|
45
|
-
module_function :build_node_task, :cook_task, :bootstrap_task, :prepare_task, :run, :run_knife
|
46
|
-
end
|
47
|
-
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe SousChef::NodeTasks do
|
4
|
-
before do
|
5
|
-
SousChef::NodeTasks.stub(:run)
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "#run_knife" do
|
9
|
-
it "should run knife solo command for given node" do
|
10
|
-
node = double('node')
|
11
|
-
node.stub(name: 'foo')
|
12
|
-
node.stub(hostname: 'node_hostname')
|
13
|
-
node.stub(ssh_config_path: 'ssh_config_path')
|
14
|
-
node.stub(config: 'knife_solo_node_config')
|
15
|
-
SousChef::NodeTasks.should_receive(:run).with("knife solo some_command -F ssh_config_path node_hostname -N foo knife_solo_node_config")
|
16
|
-
SousChef::NodeTasks.run_knife('some_command', node)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|