capchef 0.0.5 → 0.0.6
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/lib/capchef.rb +2 -1
- data/lib/capchef/chef_recipes.rb +53 -44
- metadata +18 -9
data/lib/capchef.rb
CHANGED
data/lib/capchef/chef_recipes.rb
CHANGED
@@ -19,6 +19,8 @@ Capistrano::Configuration.instance.load do
|
|
19
19
|
namespace :chef do
|
20
20
|
desc 'Install chef recipes on remote machines.'
|
21
21
|
task :default do
|
22
|
+
# If the user specifies the HOSTS environment variable, we need to temporarily clear it or it will override the :hosts option
|
23
|
+
save_hosts_env = ENV['HOSTS']
|
22
24
|
Capchef.prepend_path(chef_solo_path) if exists?(:chef_solo_path)
|
23
25
|
|
24
26
|
config = Capchef.nodes_config
|
@@ -30,58 +32,65 @@ Capistrano::Configuration.instance.load do
|
|
30
32
|
remote_roles_tgz = "#{remote_tmpdir}/roles.tgz"
|
31
33
|
|
32
34
|
valid_hosts = []
|
33
|
-
find_servers_for_task(current_task).
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
all_hosts = find_servers_for_task(current_task).map {|s| s.host}
|
36
|
+
# From here down, all cap methods must specify the :hosts option
|
37
|
+
begin
|
38
|
+
ENV['HOSTS'] = nil
|
39
|
+
all_hosts.each do |host|
|
40
|
+
host_config = config[host]
|
41
|
+
if host_config
|
42
|
+
valid_hosts << host
|
43
|
+
put host_config.to_json, remote_node_file, :hosts => host
|
44
|
+
else
|
45
|
+
$stderr.puts "WARNING: #{host} not configured in nodes.yml, skipping"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
if valid_hosts.empty?
|
49
|
+
$stderr.puts 'No configured hosts'
|
50
|
+
exit 1
|
40
51
|
end
|
41
|
-
end
|
42
|
-
if valid_hosts.empty?
|
43
|
-
$stderr.puts 'No configured hosts'
|
44
|
-
exit 1
|
45
|
-
end
|
46
52
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
solo_rb = "file_cache_path '/etc/chef'\ncookbook_path '/etc/chef/cookbooks'\nrole_path '/etc/chef/roles'\nhttp_proxy ENV['http_proxy'] if ENV['http_proxy']\n"
|
54
|
+
put solo_rb, remote_solo_file, :hosts => valid_hosts
|
55
|
+
begin
|
56
|
+
tmp_cookbooks_tgz = Tempfile.new('cookbooks')
|
57
|
+
Dir.chdir('chef-repo') do
|
58
|
+
Minitar.pack('cookbooks', Zlib::GzipWriter.new(tmp_cookbooks_tgz))
|
59
|
+
tmp_cookbooks_tgz.close
|
60
|
+
upload tmp_cookbooks_tgz.path, remote_cookbooks_tgz, :hosts => valid_hosts
|
55
61
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
sio_roles_tgz = StringIO.new
|
63
|
+
gzip = Zlib::GzipWriter.new(sio_roles_tgz)
|
64
|
+
Minitar::Writer.open(gzip) do |tar|
|
65
|
+
#Minitar::Writer.open(sio_roles_tgz) do |tar|
|
66
|
+
Find.find('roles') do |role_file|
|
67
|
+
# TODO: This does not work (how do I specify a role in JSON?
|
68
|
+
if role_file.match(/\.yml$/)
|
69
|
+
data = YAML.load(ERB.new(File.read(role_file), nil, '-').result(binding)).to_json
|
70
|
+
new_role_file = role_file.sub(/\.yml$/, '.json')
|
71
|
+
tar.add_file_simple(new_role_file, :size=>data.size, :mode=>0644, :mtime=>File.mtime(role_file)) { |f| f.write(data) }
|
72
|
+
else
|
73
|
+
Minitar.pack_file(role_file, tar)
|
74
|
+
end
|
68
75
|
end
|
69
76
|
end
|
77
|
+
gzip.close
|
78
|
+
put sio_roles_tgz.string, remote_roles_tgz, :hosts => valid_hosts
|
70
79
|
end
|
71
|
-
|
72
|
-
|
80
|
+
Capchef.surun(self, [
|
81
|
+
'mkdir -p /etc/chef',
|
82
|
+
'cd /etc/chef',
|
83
|
+
'rm -rf cookbooks roles',
|
84
|
+
"tar zxf #{remote_cookbooks_tgz}",
|
85
|
+
"tar zxf #{remote_roles_tgz}",
|
86
|
+
"chef-solo -c #{remote_solo_file} -j #{remote_node_file}"
|
87
|
+
], :hosts => valid_hosts)
|
88
|
+
ensure
|
89
|
+
tmp_cookbooks_tgz.unlink
|
73
90
|
end
|
74
|
-
Capchef.surun(self, [
|
75
|
-
'mkdir -p /etc/chef',
|
76
|
-
'cd /etc/chef',
|
77
|
-
'rm -rf cookbooks roles',
|
78
|
-
"tar zxf #{remote_cookbooks_tgz}",
|
79
|
-
"tar zxf #{remote_roles_tgz}",
|
80
|
-
"chef-solo -c #{remote_solo_file} -j #{remote_node_file}"
|
81
|
-
], :hosts => valid_hosts)
|
82
91
|
ensure
|
83
|
-
|
84
|
-
run "rm -rf #{remote_tmpdir}"
|
92
|
+
ENV['HOSTS'] = save_hosts_env
|
93
|
+
run "rm -rf #{remote_tmpdir}" unless ENV['CAPCHEF_KEEP_TEMP']
|
85
94
|
end
|
86
95
|
end
|
87
96
|
end
|
metadata
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capchef
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 6
|
9
|
+
version: 0.0.6
|
6
10
|
platform: ruby
|
7
11
|
authors:
|
8
12
|
- Brad Pardee
|
@@ -10,17 +14,18 @@ autorequire:
|
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
16
|
|
13
|
-
date: 2011-09-
|
17
|
+
date: 2011-09-21 00:00:00 -04:00
|
14
18
|
default_executable:
|
15
19
|
dependencies:
|
16
20
|
- !ruby/object:Gem::Dependency
|
17
21
|
name: capistrano
|
18
22
|
prerelease: false
|
19
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
-
none: false
|
21
24
|
requirements:
|
22
25
|
- - ">="
|
23
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
24
29
|
version: "0"
|
25
30
|
type: :runtime
|
26
31
|
version_requirements: *id001
|
@@ -28,10 +33,11 @@ dependencies:
|
|
28
33
|
name: json
|
29
34
|
prerelease: false
|
30
35
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
-
none: false
|
32
36
|
requirements:
|
33
37
|
- - ">="
|
34
38
|
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
35
41
|
version: "0"
|
36
42
|
type: :runtime
|
37
43
|
version_requirements: *id002
|
@@ -39,10 +45,11 @@ dependencies:
|
|
39
45
|
name: minitar
|
40
46
|
prerelease: false
|
41
47
|
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
48
|
requirements:
|
44
49
|
- - ">="
|
45
50
|
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
46
53
|
version: "0"
|
47
54
|
type: :runtime
|
48
55
|
version_requirements: *id003
|
@@ -72,21 +79,23 @@ rdoc_options: []
|
|
72
79
|
require_paths:
|
73
80
|
- lib
|
74
81
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
82
|
requirements:
|
77
83
|
- - ">="
|
78
84
|
- !ruby/object:Gem::Version
|
85
|
+
segments:
|
86
|
+
- 0
|
79
87
|
version: "0"
|
80
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
89
|
requirements:
|
83
90
|
- - ">="
|
84
91
|
- !ruby/object:Gem::Version
|
92
|
+
segments:
|
93
|
+
- 0
|
85
94
|
version: "0"
|
86
95
|
requirements: []
|
87
96
|
|
88
97
|
rubyforge_project:
|
89
|
-
rubygems_version: 1.
|
98
|
+
rubygems_version: 1.3.6
|
90
99
|
signing_key:
|
91
100
|
specification_version: 3
|
92
101
|
summary: Chef capistrano recipes
|