capchef 0.0.3 → 0.0.4
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/README.md +3 -0
- data/lib/capchef/chef_recipes.rb +9 -2
- data/lib/capchef.rb +60 -23
- metadata +9 -18
data/README.md
CHANGED
@@ -35,6 +35,9 @@ Your Capfile might look something like the following:
|
|
35
35
|
require 'capchef/chef_recipes'
|
36
36
|
require 'capchef/utility_recipes'
|
37
37
|
|
38
|
+
# Uncomment the following if running scripts under sudo isn't allowed
|
39
|
+
#Capchef.use_sudo = false
|
40
|
+
|
38
41
|
role :node, *Capchef.all_nodes
|
39
42
|
|
40
43
|
# Define the path to the chef-solo executable if it's not in /usr/bin or /usr/local/bin
|
data/lib/capchef/chef_recipes.rb
CHANGED
@@ -60,7 +60,7 @@ Capistrano::Configuration.instance.load do
|
|
60
60
|
Find.find('roles') do |role_file|
|
61
61
|
# TODO: This does not work (how do I specify a role in JSON?
|
62
62
|
if role_file.match(/\.yml$/)
|
63
|
-
data = YAML.load(ERB.new(File.read(role_file)).result(binding)).to_json
|
63
|
+
data = YAML.load(ERB.new(File.read(role_file), nil, '-').result(binding)).to_json
|
64
64
|
new_role_file = role_file.sub(/\.yml$/, '.json')
|
65
65
|
tar.add_file_simple(new_role_file, :size=>data.size, :mode=>0644, :mtime=>File.mtime(role_file)) { |f| f.write(data) }
|
66
66
|
else
|
@@ -71,7 +71,14 @@ Capistrano::Configuration.instance.load do
|
|
71
71
|
gzip.close
|
72
72
|
put sio_roles_tgz.string, remote_roles_tgz, :hosts => valid_hosts
|
73
73
|
end
|
74
|
-
Capchef.surun(self,
|
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)
|
75
82
|
ensure
|
76
83
|
tmp_cookbooks_tgz.unlink
|
77
84
|
run "rm -rf #{remote_tmpdir}"
|
data/lib/capchef.rb
CHANGED
@@ -27,36 +27,51 @@ module Capchef
|
|
27
27
|
@path = "#{dir}:#{path}"
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
def use_sudo=(val)
|
31
|
+
@use_sudo = val
|
32
|
+
end
|
33
|
+
|
34
|
+
def use_sudo?
|
35
|
+
return true if ENV['CAPCHEF_SUDO'] == 'true'
|
36
|
+
return false if ENV['CAPCHEF_SUDO'] == 'false'
|
37
|
+
# Default to true if unset
|
38
|
+
@use_sudo = true if @use_sudo.nil?
|
39
|
+
return @use_sudo
|
40
|
+
end
|
41
|
+
|
42
|
+
# Runs +command+ as root invoking the command with 'su -c' and handling the root password prompt.
|
32
43
|
#
|
33
|
-
# surun "/etc/init.d/apache reload"
|
44
|
+
# surun cap, "/etc/init.d/apache reload"
|
34
45
|
# # Executes
|
35
46
|
# # su - -c '/etc/init.d/apache reload'
|
36
47
|
#
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
48
|
+
# surun cap, 'my_install' do |channel, stream, output|
|
49
|
+
# channel.send_data("\n") if output && output =~ /to continue/
|
50
|
+
# channel.send_data("y\n") if output && output =~ /replace/
|
51
|
+
# end
|
52
|
+
def surun(cap, command, options={}, &block)
|
53
|
+
if use_sudo?
|
54
|
+
if command.kind_of?(Array)
|
55
|
+
my_surun_script(cap, 'surun', command, nil, options, &block)
|
56
|
+
else
|
57
|
+
sucmd = "#{cap.sudo} PATH=#{path} #{command}"
|
58
|
+
cap.run(sucmd, options)
|
59
|
+
end
|
60
|
+
else
|
61
|
+
@root_password ||= cap.fetch(:root_password, Capistrano::CLI.password_prompt("root password: "))
|
62
|
+
command = command.join(';') if command.kind_of?(Array)
|
63
|
+
sucmd = "su -c 'cd; PATH=#{path}; #{command}'"
|
64
|
+
cap.run(sucmd, options) do |channel, stream, output|
|
65
|
+
puts "[#{channel[:host]}] #{output}" if output
|
66
|
+
channel.send_data("#{@root_password}\n") if !use_sudo? && output && output =~ /^Password:/
|
67
|
+
yield channel, stream, output if block_given?
|
68
|
+
end
|
43
69
|
end
|
44
70
|
end
|
45
71
|
|
46
|
-
def surun_script(cap, script, options={})
|
72
|
+
def surun_script(cap, script, args=nil, options={}, &block)
|
47
73
|
raise "No such file: #{script}" unless File.exist?(script)
|
48
|
-
|
49
|
-
script_dir = "#{tmpdir}/#{basename}.#$$"
|
50
|
-
remote_script = "#{script_dir}/#{basename}"
|
51
|
-
cap.run "mkdir #{script_dir}", options
|
52
|
-
cap.upload script, remote_script, options
|
53
|
-
cap.run "chmod 0755 #{remote_script}", options
|
54
|
-
if block_given?
|
55
|
-
yield remote_script
|
56
|
-
else
|
57
|
-
surun cap, remote_script, options
|
58
|
-
end
|
59
|
-
cap.run "rm -rf #{script_dir}", options
|
74
|
+
my_surun_script(cap, script, nil, args, options, &block)
|
60
75
|
end
|
61
76
|
|
62
77
|
def nodes_config
|
@@ -67,7 +82,7 @@ module Capchef
|
|
67
82
|
nodes_file = ENV['NODES_FILE'] || 'nodes.yml'
|
68
83
|
raise "No file #{nodes_file}" unless File.exist?(nodes_file)
|
69
84
|
@config_pass += 1
|
70
|
-
config = YAML.load(ERB.new(File.read(nodes_file)).result(binding))
|
85
|
+
config = YAML.load(ERB.new(File.read(nodes_file), nil, '-').result(binding))
|
71
86
|
@config_pass -= 1
|
72
87
|
config
|
73
88
|
end
|
@@ -77,4 +92,26 @@ module Capchef
|
|
77
92
|
return [] if @config_pass && @config_pass > 1
|
78
93
|
return nodes_config.keys
|
79
94
|
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
# Hack way to allow either a script or a list of commands
|
99
|
+
def my_surun_script(cap, script, command_array, args, options, &block)
|
100
|
+
basename = File.basename(script)
|
101
|
+
script_dir = "#{tmpdir}/#{basename}.#$$"
|
102
|
+
remote_script = "#{script_dir}/#{basename}"
|
103
|
+
cap.run "mkdir #{script_dir}", options
|
104
|
+
if command_array
|
105
|
+
commands = command_array.join("\n")
|
106
|
+
script_text = "#!/bin/sh\n#{commands}\n"
|
107
|
+
cap.put script_text, remote_script, options
|
108
|
+
else
|
109
|
+
cap.upload script, remote_script, options
|
110
|
+
end
|
111
|
+
cap.run "chmod 0755 #{remote_script}", options
|
112
|
+
cmd = remote_script
|
113
|
+
cmd += ' ' + args if args
|
114
|
+
surun cap, cmd, options, &block
|
115
|
+
cap.run "rm -rf #{script_dir}", options
|
116
|
+
end
|
80
117
|
end
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capchef
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
version: 0.0.3
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.4
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Brad Pardee
|
@@ -14,18 +10,17 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-09 00:00:00 -04:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
21
17
|
name: capistrano
|
22
18
|
prerelease: false
|
23
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
24
21
|
requirements:
|
25
22
|
- - ">="
|
26
23
|
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 0
|
29
24
|
version: "0"
|
30
25
|
type: :runtime
|
31
26
|
version_requirements: *id001
|
@@ -33,11 +28,10 @@ dependencies:
|
|
33
28
|
name: json
|
34
29
|
prerelease: false
|
35
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
36
32
|
requirements:
|
37
33
|
- - ">="
|
38
34
|
- !ruby/object:Gem::Version
|
39
|
-
segments:
|
40
|
-
- 0
|
41
35
|
version: "0"
|
42
36
|
type: :runtime
|
43
37
|
version_requirements: *id002
|
@@ -45,11 +39,10 @@ dependencies:
|
|
45
39
|
name: minitar
|
46
40
|
prerelease: false
|
47
41
|
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
48
43
|
requirements:
|
49
44
|
- - ">="
|
50
45
|
- !ruby/object:Gem::Version
|
51
|
-
segments:
|
52
|
-
- 0
|
53
46
|
version: "0"
|
54
47
|
type: :runtime
|
55
48
|
version_requirements: *id003
|
@@ -79,23 +72,21 @@ rdoc_options: []
|
|
79
72
|
require_paths:
|
80
73
|
- lib
|
81
74
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
82
76
|
requirements:
|
83
77
|
- - ">="
|
84
78
|
- !ruby/object:Gem::Version
|
85
|
-
segments:
|
86
|
-
- 0
|
87
79
|
version: "0"
|
88
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
89
82
|
requirements:
|
90
83
|
- - ">="
|
91
84
|
- !ruby/object:Gem::Version
|
92
|
-
segments:
|
93
|
-
- 0
|
94
85
|
version: "0"
|
95
86
|
requirements: []
|
96
87
|
|
97
88
|
rubyforge_project:
|
98
|
-
rubygems_version: 1.
|
89
|
+
rubygems_version: 1.5.1
|
99
90
|
signing_key:
|
100
91
|
specification_version: 3
|
101
92
|
summary: Chef capistrano recipes
|