supply_drop 0.11.1 → 0.12.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.
- data/lib/supply_drop.rb +3 -189
- data/lib/supply_drop/plugin.rb +93 -0
- data/lib/supply_drop/tasks.rb +96 -0
- metadata +11 -7
data/lib/supply_drop.rb
CHANGED
@@ -1,198 +1,12 @@
|
|
1
1
|
require 'supply_drop/rsync'
|
2
2
|
require 'supply_drop/async_enumerable'
|
3
|
+
require 'supply_drop/plugin'
|
3
4
|
require 'supply_drop/syntax_checker'
|
4
5
|
require 'supply_drop/thread_pool'
|
5
6
|
require 'supply_drop/util'
|
6
7
|
require 'supply_drop/writer/batched'
|
7
8
|
require 'supply_drop/writer/file'
|
8
9
|
require 'supply_drop/writer/streaming'
|
10
|
+
require 'supply_drop/tasks'
|
9
11
|
|
10
|
-
Capistrano
|
11
|
-
namespace :puppet do
|
12
|
-
set :puppet_source, '.'
|
13
|
-
set :puppet_destination, '/tmp/supply_drop'
|
14
|
-
set :puppet_command, 'puppet apply'
|
15
|
-
set :puppet_lib, lambda { "#{puppet_destination}/modules" }
|
16
|
-
set :puppet_parameters, lambda { puppet_verbose ? '--debug --trace puppet.pp' : 'puppet.pp' }
|
17
|
-
set :puppet_verbose, false
|
18
|
-
set :puppet_excludes, %w(.git .svn)
|
19
|
-
set :puppet_stream_output, false
|
20
|
-
set :puppet_parallel_rsync, true
|
21
|
-
set :puppet_parallel_rsync_pool_size, 10
|
22
|
-
set :puppet_syntax_check, false
|
23
|
-
set :puppet_write_to_file, nil
|
24
|
-
set :puppet_runner, nil
|
25
|
-
set :puppet_lock_file, '/tmp/puppet.lock'
|
26
|
-
|
27
|
-
namespace :bootstrap do
|
28
|
-
desc "installs puppet via rubygems on an osx host"
|
29
|
-
task :osx do
|
30
|
-
if fetch(:use_sudo, true)
|
31
|
-
run "#{sudo} gem install puppet --no-ri --no-rdoc"
|
32
|
-
else
|
33
|
-
run "gem install puppet --no-ri --no-rdoc"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
desc "installs puppet via apt on an ubuntu host"
|
38
|
-
task :ubuntu do
|
39
|
-
run "mkdir -p #{puppet_destination}"
|
40
|
-
run "#{sudo} apt-get update"
|
41
|
-
run "#{sudo} apt-get install -y puppet rsync"
|
42
|
-
end
|
43
|
-
|
44
|
-
desc "installs puppet via yum on a centos/red hat host"
|
45
|
-
task :redhat do
|
46
|
-
run "mkdir -p #{puppet_destination}"
|
47
|
-
run "#{sudo} yum -y install puppet rsync"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
desc "checks the syntax of all *.pp and *.erb files"
|
52
|
-
task :syntax_check do
|
53
|
-
checker = SupplyDrop::SyntaxChecker.new(puppet_source)
|
54
|
-
logger.info "Sytax Checking..."
|
55
|
-
errors = false
|
56
|
-
checker.validate_puppet_files.each do |file, error|
|
57
|
-
logger.important "Puppet error: #{file}"
|
58
|
-
logger.important error
|
59
|
-
errors = true
|
60
|
-
end
|
61
|
-
checker.validate_templates.each do |file, error|
|
62
|
-
logger.important "Template error: #{file}"
|
63
|
-
logger.important error
|
64
|
-
errors = true
|
65
|
-
end
|
66
|
-
raise "syntax errors" if errors
|
67
|
-
end
|
68
|
-
|
69
|
-
desc "pushes the current puppet configuration to the server"
|
70
|
-
task :update_code, :except => { :nopuppet => true } do
|
71
|
-
servers = SupplyDrop::Util.optionally_async(find_servers_for_task(current_task), puppet_parallel_rsync)
|
72
|
-
failed_servers = servers.map do |server|
|
73
|
-
rsync_cmd = SupplyDrop::Rsync.command(
|
74
|
-
puppet_source,
|
75
|
-
SupplyDrop::Rsync.remote_address(server.user || fetch(:user, ENV['USER']), server.host, puppet_destination),
|
76
|
-
:delete => true,
|
77
|
-
:excludes => puppet_excludes,
|
78
|
-
:ssh => { :keys => ssh_options[:keys], :config => ssh_options[:config], :port => fetch(:port, nil) }
|
79
|
-
)
|
80
|
-
logger.debug rsync_cmd
|
81
|
-
server.host unless system rsync_cmd
|
82
|
-
end.compact
|
83
|
-
|
84
|
-
raise "rsync failed on #{failed_servers.join(',')}" if failed_servers.any?
|
85
|
-
end
|
86
|
-
|
87
|
-
before :'puppet:update_code' do
|
88
|
-
_set_threadpool_size
|
89
|
-
syntax_check if puppet_syntax_check
|
90
|
-
end
|
91
|
-
|
92
|
-
before 'puppet:noop' do
|
93
|
-
_prep_destination
|
94
|
-
_lock
|
95
|
-
end
|
96
|
-
|
97
|
-
before 'puppet:apply' do
|
98
|
-
_prep_destination
|
99
|
-
_lock
|
100
|
-
end
|
101
|
-
|
102
|
-
desc "runs puppet with --noop flag to show changes"
|
103
|
-
task :noop, :except => { :nopuppet => true } do
|
104
|
-
transaction do
|
105
|
-
on_rollback { _unlock }
|
106
|
-
update_code
|
107
|
-
_puppet :noop
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
desc "applies the current puppet config to the server"
|
112
|
-
task :apply, :except => { :nopuppet => true } do
|
113
|
-
transaction do
|
114
|
-
on_rollback { _unlock }
|
115
|
-
update_code
|
116
|
-
_puppet :apply
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
desc "clears the puppet lockfile on the server."
|
121
|
-
task :remove_lock, :except => { :nopuppet => true} do
|
122
|
-
_unlock
|
123
|
-
end
|
124
|
-
|
125
|
-
after 'puppet:noop' do
|
126
|
-
_unlock
|
127
|
-
end
|
128
|
-
|
129
|
-
after 'puppet:apply' do
|
130
|
-
_unlock
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def _set_threadpool_size
|
135
|
-
SupplyDrop::Util.thread_pool_size = puppet_parallel_rsync_pool_size
|
136
|
-
end
|
137
|
-
|
138
|
-
def _red_text(text)
|
139
|
-
"\033[0;31m#{text}\033[0m"
|
140
|
-
end
|
141
|
-
|
142
|
-
def _prep_destination
|
143
|
-
run "mkdir -p #{puppet_destination}"
|
144
|
-
run "#{sudo} chown -R $USER: #{puppet_destination}"
|
145
|
-
end
|
146
|
-
|
147
|
-
def _lock
|
148
|
-
if _should_lock?
|
149
|
-
run <<-GETLOCK
|
150
|
-
if [ ! -f #{puppet_lock_file} ]; then
|
151
|
-
touch #{puppet_lock_file};
|
152
|
-
else
|
153
|
-
stat -c "#{_red_text("Puppet in progress, #{puppet_lock_file} owned by %U since %x")}" #{puppet_lock_file} >&2;
|
154
|
-
exit 1;
|
155
|
-
fi
|
156
|
-
GETLOCK
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def _unlock
|
161
|
-
run "#{sudo} rm -f #{puppet_lock_file}; true" if _should_lock?
|
162
|
-
end
|
163
|
-
|
164
|
-
def _should_lock?
|
165
|
-
puppet_lock_file && !ENV['NO_PUPPET_LOCK']
|
166
|
-
end
|
167
|
-
|
168
|
-
def _puppet(command = :noop)
|
169
|
-
puppet_cmd = "cd #{puppet_destination} && #{_sudo_cmd} #{puppet_command} --modulepath=#{puppet_lib} #{puppet_parameters}"
|
170
|
-
flag = command == :noop ? '--noop' : ''
|
171
|
-
|
172
|
-
writer = if puppet_stream_output
|
173
|
-
SupplyDrop::Writer::Streaming.new(logger)
|
174
|
-
else
|
175
|
-
SupplyDrop::Writer::Batched.new(logger)
|
176
|
-
end
|
177
|
-
|
178
|
-
writer = SupplyDrop::Writer::File.new(writer, puppet_write_to_file) unless puppet_write_to_file.nil?
|
179
|
-
|
180
|
-
begin
|
181
|
-
run "#{puppet_cmd} #{flag}" do |channel, stream, data|
|
182
|
-
writer.collect_output(channel[:host], data)
|
183
|
-
end
|
184
|
-
logger.debug "Puppet #{command} complete."
|
185
|
-
ensure
|
186
|
-
writer.all_output_collected
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def _sudo_cmd
|
191
|
-
if fetch(:use_sudo, true)
|
192
|
-
sudo(:as => puppet_runner)
|
193
|
-
else
|
194
|
-
logger.info "NOTICE: puppet_runner configuration invalid when use_sudo is false, ignoring..." unless puppet_runner.nil?
|
195
|
-
''
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
12
|
+
Capistrano.plugin :supply_drop, SupplyDrop::Plugin
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module SupplyDrop
|
2
|
+
module Plugin
|
3
|
+
|
4
|
+
def rsync
|
5
|
+
SupplyDrop::Util.thread_pool_size = puppet_parallel_rsync_pool_size
|
6
|
+
servers = SupplyDrop::Util.optionally_async(find_servers_for_task(current_task), puppet_parallel_rsync)
|
7
|
+
failed_servers = servers.map do |server|
|
8
|
+
rsync_cmd = SupplyDrop::Rsync.command(
|
9
|
+
puppet_source,
|
10
|
+
SupplyDrop::Rsync.remote_address(server.user || fetch(:user, ENV['USER']), server.host, puppet_destination),
|
11
|
+
:delete => true,
|
12
|
+
:excludes => puppet_excludes,
|
13
|
+
:ssh => { :keys => ssh_options[:keys], :config => ssh_options[:config], :port => fetch(:port, nil) }
|
14
|
+
)
|
15
|
+
logger.debug rsync_cmd
|
16
|
+
server.host unless system rsync_cmd
|
17
|
+
end.compact
|
18
|
+
|
19
|
+
raise "rsync failed on #{failed_servers.join(',')}" if failed_servers.any?
|
20
|
+
end
|
21
|
+
|
22
|
+
def prepare
|
23
|
+
run "mkdir -p #{puppet_destination}"
|
24
|
+
run "#{sudo} chown -R $USER: #{puppet_destination}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def noop
|
28
|
+
puppet(:noop)
|
29
|
+
end
|
30
|
+
|
31
|
+
def apply
|
32
|
+
puppet(:apply)
|
33
|
+
end
|
34
|
+
|
35
|
+
def lock
|
36
|
+
if should_lock?
|
37
|
+
run <<-GETLOCK
|
38
|
+
if [ ! -f #{puppet_lock_file} ]; then
|
39
|
+
touch #{puppet_lock_file};
|
40
|
+
else
|
41
|
+
stat -c "#{red_text("Puppet in progress, #{puppet_lock_file} owned by %U since %x")}" #{puppet_lock_file} >&2;
|
42
|
+
exit 1;
|
43
|
+
fi
|
44
|
+
GETLOCK
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def unlock
|
49
|
+
run "#{sudo} rm -f #{puppet_lock_file}; true" if should_lock?
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def should_lock?
|
55
|
+
puppet_lock_file && !ENV['NO_PUPPET_LOCK']
|
56
|
+
end
|
57
|
+
|
58
|
+
def puppet(command = :noop)
|
59
|
+
puppet_cmd = "cd #{puppet_destination} && #{sudo_cmd} #{puppet_command} --modulepath=#{puppet_lib} #{puppet_parameters}"
|
60
|
+
flag = command == :noop ? '--noop' : ''
|
61
|
+
|
62
|
+
writer = if puppet_stream_output
|
63
|
+
SupplyDrop::Writer::Streaming.new(logger)
|
64
|
+
else
|
65
|
+
SupplyDrop::Writer::Batched.new(logger)
|
66
|
+
end
|
67
|
+
|
68
|
+
writer = SupplyDrop::Writer::File.new(writer, puppet_write_to_file) unless puppet_write_to_file.nil?
|
69
|
+
|
70
|
+
begin
|
71
|
+
run "#{puppet_cmd} #{flag}" do |channel, stream, data|
|
72
|
+
writer.collect_output(channel[:host], data)
|
73
|
+
end
|
74
|
+
logger.debug "Puppet #{command} complete."
|
75
|
+
ensure
|
76
|
+
writer.all_output_collected
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def red_text(text)
|
81
|
+
"\033[0;31m#{text}\033[0m"
|
82
|
+
end
|
83
|
+
|
84
|
+
def sudo_cmd
|
85
|
+
if fetch(:use_sudo, true)
|
86
|
+
sudo(:as => puppet_runner)
|
87
|
+
else
|
88
|
+
logger.info "NOTICE: puppet_runner configuration invalid when use_sudo is false, ignoring..." unless puppet_runner.nil?
|
89
|
+
''
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :puppet do
|
3
|
+
set :puppet_source, '.'
|
4
|
+
set :puppet_destination, '/tmp/supply_drop'
|
5
|
+
set :puppet_command, 'puppet apply'
|
6
|
+
set :puppet_lib, lambda { "#{puppet_destination}/modules" }
|
7
|
+
set :puppet_parameters, lambda { puppet_verbose ? '--debug --trace puppet.pp' : 'puppet.pp' }
|
8
|
+
set :puppet_verbose, false
|
9
|
+
set :puppet_excludes, %w(.git .svn)
|
10
|
+
set :puppet_stream_output, false
|
11
|
+
set :puppet_parallel_rsync, true
|
12
|
+
set :puppet_parallel_rsync_pool_size, 10
|
13
|
+
set :puppet_syntax_check, false
|
14
|
+
set :puppet_write_to_file, nil
|
15
|
+
set :puppet_runner, nil
|
16
|
+
set :puppet_lock_file, '/tmp/puppet.lock'
|
17
|
+
|
18
|
+
namespace :bootstrap do
|
19
|
+
desc "installs puppet via rubygems on an osx host"
|
20
|
+
task :osx do
|
21
|
+
if fetch(:use_sudo, true)
|
22
|
+
run "#{sudo} gem install puppet --no-ri --no-rdoc"
|
23
|
+
else
|
24
|
+
run "gem install puppet --no-ri --no-rdoc"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "installs puppet via apt on an ubuntu host"
|
29
|
+
task :ubuntu do
|
30
|
+
run "mkdir -p #{puppet_destination}"
|
31
|
+
run "#{sudo} apt-get update"
|
32
|
+
run "#{sudo} apt-get install -y puppet rsync"
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "installs puppet via yum on a centos/red hat host"
|
36
|
+
task :redhat do
|
37
|
+
run "mkdir -p #{puppet_destination}"
|
38
|
+
run "#{sudo} yum -y install puppet rsync"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "checks the syntax of all *.pp and *.erb files"
|
43
|
+
task :syntax_check do
|
44
|
+
checker = SupplyDrop::SyntaxChecker.new(puppet_source)
|
45
|
+
logger.info "Sytax Checking..."
|
46
|
+
errors = false
|
47
|
+
checker.validate_puppet_files.each do |file, error|
|
48
|
+
logger.important "Puppet error: #{file}"
|
49
|
+
logger.important error
|
50
|
+
errors = true
|
51
|
+
end
|
52
|
+
checker.validate_templates.each do |file, error|
|
53
|
+
logger.important "Template error: #{file}"
|
54
|
+
logger.important error
|
55
|
+
errors = true
|
56
|
+
end
|
57
|
+
raise "syntax errors" if errors
|
58
|
+
end
|
59
|
+
|
60
|
+
desc "pushes the current puppet configuration to the server"
|
61
|
+
task :update_code, :except => { :nopuppet => true } do
|
62
|
+
syntax_check if puppet_syntax_check
|
63
|
+
supply_drop.rsync
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "runs puppet with --noop flag to show changes"
|
67
|
+
task :noop, :except => { :nopuppet => true } do
|
68
|
+
transaction do
|
69
|
+
on_rollback { supply_drop.unlock }
|
70
|
+
supply_drop.prepare
|
71
|
+
supply_drop.lock
|
72
|
+
update_code
|
73
|
+
supply_drop.noop
|
74
|
+
supply_drop.unlock
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
desc "applies the current puppet config to the server"
|
79
|
+
task :apply, :except => { :nopuppet => true } do
|
80
|
+
transaction do
|
81
|
+
on_rollback { supply_drop.unlock }
|
82
|
+
supply_drop.prepare
|
83
|
+
supply_drop.lock
|
84
|
+
update_code
|
85
|
+
supply_drop.apply
|
86
|
+
supply_drop.unlock
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
desc "clears the puppet lockfile on the server."
|
91
|
+
task :remove_lock, :except => { :nopuppet => true} do
|
92
|
+
supply_drop.lock
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: supply_drop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 47
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 12
|
9
|
+
- 0
|
10
|
+
version: 0.12.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tony Pitluga
|
@@ -16,7 +16,8 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2012-
|
19
|
+
date: 2012-10-16 00:00:00 -05:00
|
20
|
+
default_executable:
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
23
|
name: capistrano
|
@@ -48,14 +49,17 @@ files:
|
|
48
49
|
- README.md
|
49
50
|
- Rakefile
|
50
51
|
- lib/supply_drop/async_enumerable.rb
|
52
|
+
- lib/supply_drop/plugin.rb
|
51
53
|
- lib/supply_drop/rsync.rb
|
52
54
|
- lib/supply_drop/syntax_checker.rb
|
55
|
+
- lib/supply_drop/tasks.rb
|
53
56
|
- lib/supply_drop/thread_pool.rb
|
54
57
|
- lib/supply_drop/util.rb
|
55
58
|
- lib/supply_drop/writer/batched.rb
|
56
59
|
- lib/supply_drop/writer/file.rb
|
57
60
|
- lib/supply_drop/writer/streaming.rb
|
58
61
|
- lib/supply_drop.rb
|
62
|
+
has_rdoc: true
|
59
63
|
homepage: http://github.com/pitluga/supply_drop
|
60
64
|
licenses: []
|
61
65
|
|
@@ -85,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
89
|
requirements: []
|
86
90
|
|
87
91
|
rubyforge_project:
|
88
|
-
rubygems_version: 1.
|
92
|
+
rubygems_version: 1.3.7
|
89
93
|
signing_key:
|
90
94
|
specification_version: 3
|
91
95
|
summary: Masterless puppet with capistrano
|