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

View File

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

View File

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