move to a more modular approach, allow for external gems to provide resources like a railtie

This commit is contained in:
John Bintz 2012-10-04 11:51:05 -04:00
parent 2d5cfed24a
commit 2cc210c520
43 changed files with 118 additions and 20 deletions

View File

@ -1,9 +1,20 @@
require "puppet-standalone-mashup/version"
module Puppet
module Standalone
module Mashup
# Your code goes here...
end
module PuppetStandaloneMashup
autoload :Provider, 'puppet-standalone-mashup/provider'
autoload :Configuration, 'puppet-standalone-mashup/configuration'
class ProvideMyself < Provider ; end
def self.configure
yield configuration
end
def self.configuration
@configuration ||= Configuration.new
end
def self.paths_for(*args)
Provider.paths_for(*args)
end
end

View File

@ -1,4 +1,5 @@
require 'erb'
require 'puppet-standalone-mashup'
def _cset(name, *args, &block)
unless exists?(name)
@ -6,10 +7,6 @@ def _cset(name, *args, &block)
end
end
module PuppetStandaloneMashup
BASE = Pathname(File.expand_path('../../..', __FILE__))
end
require 'capistrano/command'
module Capistrano
@ -117,19 +114,33 @@ Capistrano::Configuration.instance.load do
end
end
def upload_directory_safely(source, target, options = {})
run "mkdir -p #{target}"
Dir["#{source}/*"].each do |child|
top.upload child, File.join(target, File.basename(child)), options
end
end
desc "Copy skel files to remote server"
task :copy_skel do
top.ensure_puppet_dir
[ '*.erb', "#{distribution}/*.erb" ].each do |dir|
Dir[PuppetStandaloneMashup::BASE.join('skel').join(dir).to_s].each do |file|
data = StringIO.new(ERB.new(File.read(file)).result(binding))
targets = []
top.upload data, target = File.join(puppet_dir, File.basename(file, '.erb'))
PuppetStandaloneMashup.paths_for('skel').each do |path|
[ '*.erb', "#{distribution}/*.erb" ].each do |dir|
Dir[path.join(dir).to_s].each do |file|
data = StringIO.new(ERB.new(File.read(file)).result(binding))
run "chmod a+x #{target}"
top.upload data, target = File.join(puppet_dir, File.basename(file, '.erb'))
targets << target
end
end
end
run "chmod a+x #{targets.join(' ')}"
end
desc "Copy shared"
@ -138,8 +149,8 @@ Capistrano::Configuration.instance.load do
run "mkdir -p #{puppet_dir}/shared/additional-modules"
(%w{lib modules templates} + additional_modules.collect { |dir| "additional-modules/#{dir}" }).each do |dir|
top.upload PuppetStandaloneMashup::BASE.join('shared', dir).to_s, File.join(puppet_dir, 'shared', dir)
PuppetStandaloneMashup.configuration.shared_paths.each do |path|
upload_directory_safely path.to_s, File.join(puppet_dir, 'shared', path.target)
end
end
@ -164,7 +175,7 @@ Capistrano::Configuration.instance.load do
end
def with_additional_puppet_bin_path
additional_puppet_bin_path ? %{PATH="#{additional_puppet_bin_path}:$PATH"} : ''
"PATH=" + (PuppetStandaloneMashup.configuration.bin_path + [ "$PATH" ]).join(':')
end
desc "Get managing user's public key"

View File

@ -0,0 +1,60 @@
require 'delegate'
class Pathname
def only_valid_paths_for_directories(*dirs)
valid_paths = []
dirs.flatten.each do |dir|
target = self.join(dir)
if target.directory?
valid_paths << target
end
end
valid_paths
end
end
module PuppetStandaloneMashup
class TargetedPath < SimpleDelegator
attr_reader :path, :target
def initialize(path, target = path.basename)
@path, @target = path, target
end
def __getobj__
@path
end
end
class Configuration
SHARED_DIRS = %w{lib modules templates}
def additional_modules
@additional_modules ||= []
end
def bin_path
@bin_path ||= []
end
def shared_paths
return @shared_paths if @shared_paths
@shared_paths = []
Provider.paths_for('shared').each do |path|
@shared_paths += path.only_valid_paths_for_directories(SHARED_DIRS).collect { |dirpath| TargetedPath.new(dirpath) }
end
Provider.paths_for('additional-modules').each do |path|
@shared_paths += path.only_valid_paths_for_directories(additional_modules).collect { |dirpath| TargetedPath.new(dirpath, "modules/#{dirpath.basename}") }
end
@shared_paths
end
end
end

View File

@ -0,0 +1,15 @@
class PuppetStandaloneMashup::Provider
def self.shared_sources
@shared_sources ||= []
end
def self.inherited(klass)
shared_sources << Pathname(caller.first.gsub(%r{lib/.*}, ''))
end
def self.paths_for(*paths)
shared_sources.collect do |source|
paths.collect { |path| source.join(path) }
end.flatten
end
end

View File

@ -5,7 +5,8 @@ define ssh {
ensure => directory,
mode => '0700',
owner => $name,
group => $name
group => $name,
require => User[$name]
}
file { "${ssh_dir}/authorized_keys":

View File

@ -5,8 +5,8 @@ RUBYLIB="${PWD}/lib:${PWD}/shared/lib" \
<%= with_additional_puppet_bin_path %> \
puppet apply <%= additional_puppet_options %> \
--confdir=$PWD \
--modulepath=$PWD/modules:$PWD/shared/modules:$PWD/shared/additional-modules \
--templatedir=$PWD/shared/templates:$PWD/templates \
--modulepath=$PWD/modules:$PWD/shared/modules \
--templatedir=$PWD/templates:$PWD/shared/templates \
-v --no-report $@ \
manifests/site.pp