chef_cap 0.0.7 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +34 -0
- data/lib/chef_cap/version.rb +2 -2
- data/recipes/chef_cap.rb +14 -5
- data/spec/chef_cap_mock_cap.rb +3 -1
- data/spec/chef_cap_spec.rb +68 -31
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -34,6 +34,40 @@ Then run:
|
|
34
34
|
|
35
35
|
Which will overwrite your Capfile and create a chef directory with sample files unless one already exists.
|
36
36
|
|
37
|
+
=== Tasks
|
38
|
+
|
39
|
+
Remove all chef-cap files from /tmp
|
40
|
+
|
41
|
+
$ cap <environment> chef:cleanup
|
42
|
+
|
43
|
+
Run chef-solo on the server(s)
|
44
|
+
|
45
|
+
$ cap <environment> chef:deploy
|
46
|
+
|
47
|
+
Setup chef solo on the server(s)
|
48
|
+
|
49
|
+
$ cap <environment> chef:setup
|
50
|
+
|
51
|
+
Run chef without deploy
|
52
|
+
|
53
|
+
$ cap <environment> cook
|
54
|
+
|
55
|
+
=== chef/node.json
|
56
|
+
|
57
|
+
The following JSON keys are required in your node.json file:
|
58
|
+
|
59
|
+
{ "application": { "name": NAME } }
|
60
|
+
{ "application": { "repository": REPOSITORY } }
|
61
|
+
{ "environments": { ENVIRONMENT: { "rails_env": RAILS_ENV } } }
|
62
|
+
{ "roles": { ROLE: { "run_list": [] } } }
|
63
|
+
{ "run_list": [] }
|
64
|
+
|
65
|
+
Optional JSON keys:
|
66
|
+
|
67
|
+
{ "environments": { ENVIRONMENT: { "role_order": { FIRST_ROLE: [OTHER_ROLES] } } } }
|
68
|
+
{ "environments": { ENVIRONMENT: { "environment_settings": ENV_HASH } } }
|
69
|
+
|
70
|
+
|
37
71
|
== REQUIREMENTS
|
38
72
|
|
39
73
|
* Capistrano 2.x
|
data/lib/chef_cap/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module ChefCap
|
2
|
-
VERSION = "0.
|
3
|
-
end
|
2
|
+
VERSION = "0.1.1"
|
3
|
+
end
|
data/recipes/chef_cap.rb
CHANGED
@@ -28,6 +28,7 @@ if ChefDnaParser.parsed["environments"]
|
|
28
28
|
task environment.to_sym do
|
29
29
|
set :environment_settings, environment_hash
|
30
30
|
set :rails_env, environment_hash["rails_env"] || environment
|
31
|
+
set :role_order, environment_hash["role_order"] || {}
|
31
32
|
default_environment["RAILS_ENV"] = rails_env
|
32
33
|
|
33
34
|
ChefCapHelper.parse_hash(environment_hash)
|
@@ -182,12 +183,20 @@ namespace :chef do
|
|
182
183
|
end
|
183
184
|
|
184
185
|
task :run_chef_solo do
|
185
|
-
db = find_servers(:roles => [:db]).map(&:host)
|
186
|
-
app_and_web_only = find_servers(:roles => [:app, :web]).map(&:host) - db
|
187
|
-
|
188
186
|
run_chef_solo = "env PATH=$PATH:/usr/sbin rvm default exec chef-solo -c /tmp/chef-cap-solo-#{rails_env}.rb -j /tmp/chef-cap-#{rails_env}-`hostname`.json #{ENV['DEBUG'] ? '-l debug' : ''}"
|
189
|
-
|
190
|
-
|
187
|
+
|
188
|
+
unless role_order.empty?
|
189
|
+
role_order.each do |role, dependent_roles|
|
190
|
+
role_hosts = find_servers(:roles => [role.to_sym]).map(&:host)
|
191
|
+
dependent_hosts = find_servers(:roles => dependent_roles.map(&:to_sym)).map(&:host) - role_hosts
|
192
|
+
|
193
|
+
sudo(run_chef_solo, :hosts => role_hosts) if role_hosts.any?
|
194
|
+
sudo(run_chef_solo, :hosts => dependent_hosts) if dependent_hosts.any?
|
195
|
+
end
|
196
|
+
else
|
197
|
+
sudo(run_chef_solo)
|
198
|
+
end
|
199
|
+
|
191
200
|
end
|
192
201
|
|
193
202
|
desc "Remove all chef-cap files from /tmp"
|
data/spec/chef_cap_mock_cap.rb
CHANGED
@@ -13,10 +13,12 @@ end
|
|
13
13
|
def find_servers(options = {})
|
14
14
|
servers = []
|
15
15
|
options[:roles].each do |role|
|
16
|
-
if @servers.has_key?
|
16
|
+
if @servers && @servers.has_key?(role)
|
17
17
|
@servers[role][:servers].each do |server|
|
18
18
|
servers << TestCapServer.new(server)
|
19
19
|
end
|
20
|
+
else
|
21
|
+
raise ArgumentError, "unknown role `#{role}'" unless roles.include?(role)
|
20
22
|
end
|
21
23
|
end
|
22
24
|
servers
|
data/spec/chef_cap_spec.rb
CHANGED
@@ -351,20 +351,20 @@ describe "chef_cap" do
|
|
351
351
|
server_session.things_that_were_set["node_hash_for_localhost"].should == {
|
352
352
|
"environments" => {"some_env"=>{ "rails_env" => "myenv",
|
353
353
|
"servers"=>[ {"hostname"=>"localhost", "roles"=>["role1", "role2"] }, {"hostname"=>"otherhost.com", "roles"=>["role1"]}]}},
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
354
|
+
"chef" => {"root"=>"path_to_cookbooks"},
|
355
|
+
"run_list" => ["foo", "bar"],
|
356
|
+
"environment" => {"rails_env" => "myenv", "servers"=>[ {"primary" => [], "hostname"=>"localhost", "roles"=>["role1", "role2"] },
|
357
|
+
{"primary" => [], "hostname"=>"otherhost.com", "roles"=>["role1"]}]},
|
358
|
+
"roles" => {"role1" => {"run_list"=>["foo"]}, "role2"=>{"run_list"=>["foo", "bar"]}}}
|
359
359
|
elsif server_session.things_that_were_set.keys.include? "node_hash_for_otherhost"
|
360
360
|
server_session.things_that_were_set["node_hash_for_otherhost"].should == {
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
361
|
+
"environments" => {"some_env"=>{ "rails_env" => "myenv",
|
362
|
+
"servers"=>[{"hostname"=>"localhost", "roles"=>["role1", "role2"]}, {"hostname"=>"otherhost.com", "roles"=>["role1"]}]}},
|
363
|
+
"chef"=>{"root"=>"path_to_cookbooks"},
|
364
|
+
"run_list"=>["foo"],
|
365
|
+
"environment"=>{"rails_env" => "myenv", "servers"=>[{"primary" => [], "hostname"=>"localhost", "roles"=>["role1", "role2"]},
|
366
|
+
{"primary" => [], "hostname"=>"otherhost.com", "roles"=>["role1"]}]},
|
367
|
+
"roles"=>{"role1"=>{"run_list"=>["foo"]}, "role2"=>{"run_list"=>["foo", "bar"]}}}
|
368
368
|
end
|
369
369
|
end
|
370
370
|
end
|
@@ -419,9 +419,9 @@ describe "chef_cap" do
|
|
419
419
|
end
|
420
420
|
|
421
421
|
describe "task :run_chef_solo" do
|
422
|
-
|
423
|
-
|
424
|
-
|
422
|
+
context "with a db role" do
|
423
|
+
before do
|
424
|
+
@test_dna = <<-JS
|
425
425
|
{
|
426
426
|
"chef": {
|
427
427
|
"root": "path_to_cookbooks"
|
@@ -429,6 +429,7 @@ describe "chef_cap" do
|
|
429
429
|
"environments": {
|
430
430
|
"some_env": {
|
431
431
|
"rails_env": "myenv",
|
432
|
+
"role_order": { "db": ["app"] },
|
432
433
|
"servers": [
|
433
434
|
{
|
434
435
|
"hostname": "dbhost",
|
@@ -446,18 +447,54 @@ describe "chef_cap" do
|
|
446
447
|
"app": { "run_list": [] }
|
447
448
|
}
|
448
449
|
}
|
449
|
-
|
450
|
+
JS
|
450
451
|
|
451
|
-
|
452
|
-
|
452
|
+
chef_cap.cap_task[:some_env].should_not be_nil
|
453
|
+
chef_cap.cap_task[:some_env].call
|
454
|
+
end
|
455
|
+
|
456
|
+
it "invokes chef-solo on db hosts then app and web only hosts" do
|
457
|
+
chef_cap.cap_servers.should_not be_empty
|
458
|
+
|
459
|
+
chef_cap.should_receive(:sudo).ordered.with(/.*chef-solo.*/, :hosts => ["dbhost"]).and_return("mocked")
|
460
|
+
chef_cap.should_receive(:sudo).ordered.with(/.*chef-solo.*/, :hosts => ["apphost"]).and_return("mocked")
|
461
|
+
chef_cap.cap_task["chef:run_chef_solo"].call
|
462
|
+
end
|
453
463
|
end
|
454
464
|
|
455
|
-
|
456
|
-
|
465
|
+
context "without a db role" do
|
466
|
+
before do
|
467
|
+
@test_dna = <<-JS
|
468
|
+
{
|
469
|
+
"chef": {
|
470
|
+
"root": "path_to_cookbooks"
|
471
|
+
},
|
472
|
+
"environments": {
|
473
|
+
"some_env": {
|
474
|
+
"rails_env": "some_env",
|
475
|
+
"servers": [
|
476
|
+
{
|
477
|
+
"hostname": "somehost",
|
478
|
+
"roles": ["somerole"]
|
479
|
+
}
|
480
|
+
]
|
481
|
+
}
|
482
|
+
},
|
483
|
+
"roles": {
|
484
|
+
"somerole": { "run_list": [] }
|
485
|
+
}
|
486
|
+
}
|
487
|
+
JS
|
488
|
+
|
489
|
+
chef_cap.cap_task[:some_env].should_not be_nil
|
490
|
+
chef_cap.cap_task[:some_env].call
|
491
|
+
end
|
457
492
|
|
458
|
-
|
459
|
-
|
460
|
-
|
493
|
+
|
494
|
+
it "works" do
|
495
|
+
chef_cap.stub!(:sudo)
|
496
|
+
chef_cap.cap_task["chef:run_chef_solo"].call
|
497
|
+
end
|
461
498
|
end
|
462
499
|
end
|
463
500
|
|
@@ -646,8 +683,8 @@ describe "chef_cap" do
|
|
646
683
|
chef_cap.parallel_sessions.each do |server_session|
|
647
684
|
if server_session.things_that_were_set.keys.include? "node_hash_for_localhost"
|
648
685
|
server_session.things_that_were_set["node_hash_for_localhost"]["environment"].should == {"some_default"=>"yes",
|
649
|
-
|
650
|
-
|
686
|
+
"something_else"=>"okay",
|
687
|
+
"servers"=>[{"primary" => [], "hostname"=>"localhost", "roles"=>["role1", "role2"]}]}
|
651
688
|
end
|
652
689
|
end
|
653
690
|
end
|
@@ -795,12 +832,12 @@ describe "chef_cap" do
|
|
795
832
|
server_session.stub!(:put => "stubbed")
|
796
833
|
server_session.stub!(:sudo => "stubbed")
|
797
834
|
server_session.should_receive(:set).with("node_hash_for_localhost",
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
835
|
+
{"environments" => { "some_env"=>{"servers"=>[{"hostname"=>"localhost", "roles"=>["role1", "role2"]}]}},
|
836
|
+
"something"=>"other", "foo"=>"bar",
|
837
|
+
"chef"=>{"root"=>"path_to_cookbooks"},
|
838
|
+
"run_list"=>nil, "shared"=>{"foo"=>"bar"},
|
839
|
+
"environment"=> {"revision"=>"123", "branch" => "somebranch", "servers"=>[{"primary" => [], "hostname"=>"localhost", "roles"=>["role1", "role2"]}]}, "roles"=>{"role1"=>{"something"=>"other"}}}
|
840
|
+
)
|
804
841
|
}
|
805
842
|
chef_cap.cap_task["chef:deploy"].call
|
806
843
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Case Commons, LLC
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-02-25 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|