From 2cc210c520ee7b83d7ce61e97f05f6a2a410de30 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Thu, 4 Oct 2012 11:51:05 -0400 Subject: [PATCH] move to a more modular approach, allow for external gems to provide resources like a railtie --- .../debian-base/manifests/init.pp | 0 .../debian/manifests/init.pp | 0 .../god/manifests/init.pp | 0 .../god/templates/debian/init_d_prerun | 0 .../god/templates/debian/init_d_prolog | 0 .../god/templates/god-init.d | 0 .../god/templates/redhat/init_d_prerun | 0 .../god/templates/redhat/init_d_prolog | 0 .../nginx-debian/manifests/init.pp | 0 .../nginx-www/manifests/init.pp | 0 .../nginx/manifests/init.pp | 0 .../nginx/templates/fastcgi.conf | 0 .../nginx/templates/fastcgi_params | 0 .../nginx/templates/nginx.conf | 0 .../ruby/manifests/falcon.pp | 0 .../ruby/manifests/init.pp | 0 .../ruby/templates/falcon-patch.sh | 0 .../squid/manifests/debian.pp | 0 .../squid/manifests/init.pp | 0 .../squid/templates/clear-squid-cache | 0 .../squid/templates/configure | 0 .../squid/templates/debian/init-d-prerun | 0 .../squid/templates/debian/init-d-prolog | 0 .../squid/templates/preconfigure | 0 .../squid/templates/squid-init.d | 0 .../tc/manifests/debian.pp | 0 .../tc/manifests/init.pp | 0 .../tc/templates/debian/init-d-prerun | 0 .../tc/templates/debian/init-d-prolog | 0 .../tc/templates/tc-init.d | 0 .../varnish/manifests/init.pp | 0 .../varnish/templates/debian/init_d_prerun | 0 .../varnish/templates/debian/init_d_prolog | 0 .../varnish/templates/default | 0 .../varnish/templates/redhat/init_d_prerun | 0 .../varnish/templates/redhat/init_d_prolog | 0 .../varnish/templates/varnish-init.d | 0 lib/puppet-standalone-mashup.rb | 21 +++++-- lib/puppet-standalone-mashup/capistrano.rb | 35 +++++++---- lib/puppet-standalone-mashup/configuration.rb | 60 +++++++++++++++++++ lib/puppet-standalone-mashup/provider.rb | 15 +++++ shared/modules/ssh/manifests/init.pp | 3 +- skel/apply.erb | 4 +- 43 files changed, 118 insertions(+), 20 deletions(-) rename {shared/additional-modules => additional-modules}/debian-base/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/debian/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/god/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/god/templates/debian/init_d_prerun (100%) rename {shared/additional-modules => additional-modules}/god/templates/debian/init_d_prolog (100%) rename {shared/additional-modules => additional-modules}/god/templates/god-init.d (100%) rename {shared/additional-modules => additional-modules}/god/templates/redhat/init_d_prerun (100%) rename {shared/additional-modules => additional-modules}/god/templates/redhat/init_d_prolog (100%) rename {shared/additional-modules => additional-modules}/nginx-debian/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/nginx-www/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/nginx/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/nginx/templates/fastcgi.conf (100%) rename {shared/additional-modules => additional-modules}/nginx/templates/fastcgi_params (100%) rename {shared/additional-modules => additional-modules}/nginx/templates/nginx.conf (100%) rename {shared/additional-modules => additional-modules}/ruby/manifests/falcon.pp (100%) rename {shared/additional-modules => additional-modules}/ruby/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/ruby/templates/falcon-patch.sh (100%) rename {shared/additional-modules => additional-modules}/squid/manifests/debian.pp (100%) rename {shared/additional-modules => additional-modules}/squid/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/squid/templates/clear-squid-cache (100%) rename {shared/additional-modules => additional-modules}/squid/templates/configure (100%) rename {shared/additional-modules => additional-modules}/squid/templates/debian/init-d-prerun (100%) rename {shared/additional-modules => additional-modules}/squid/templates/debian/init-d-prolog (100%) rename {shared/additional-modules => additional-modules}/squid/templates/preconfigure (100%) rename {shared/additional-modules => additional-modules}/squid/templates/squid-init.d (100%) rename {shared/additional-modules => additional-modules}/tc/manifests/debian.pp (100%) rename {shared/additional-modules => additional-modules}/tc/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/tc/templates/debian/init-d-prerun (100%) rename {shared/additional-modules => additional-modules}/tc/templates/debian/init-d-prolog (100%) rename {shared/additional-modules => additional-modules}/tc/templates/tc-init.d (100%) rename {shared/additional-modules => additional-modules}/varnish/manifests/init.pp (100%) rename {shared/additional-modules => additional-modules}/varnish/templates/debian/init_d_prerun (100%) rename {shared/additional-modules => additional-modules}/varnish/templates/debian/init_d_prolog (100%) rename {shared/additional-modules => additional-modules}/varnish/templates/default (100%) rename {shared/additional-modules => additional-modules}/varnish/templates/redhat/init_d_prerun (100%) rename {shared/additional-modules => additional-modules}/varnish/templates/redhat/init_d_prolog (100%) rename {shared/additional-modules => additional-modules}/varnish/templates/varnish-init.d (100%) create mode 100644 lib/puppet-standalone-mashup/configuration.rb create mode 100644 lib/puppet-standalone-mashup/provider.rb diff --git a/shared/additional-modules/debian-base/manifests/init.pp b/additional-modules/debian-base/manifests/init.pp similarity index 100% rename from shared/additional-modules/debian-base/manifests/init.pp rename to additional-modules/debian-base/manifests/init.pp diff --git a/shared/additional-modules/debian/manifests/init.pp b/additional-modules/debian/manifests/init.pp similarity index 100% rename from shared/additional-modules/debian/manifests/init.pp rename to additional-modules/debian/manifests/init.pp diff --git a/shared/additional-modules/god/manifests/init.pp b/additional-modules/god/manifests/init.pp similarity index 100% rename from shared/additional-modules/god/manifests/init.pp rename to additional-modules/god/manifests/init.pp diff --git a/shared/additional-modules/god/templates/debian/init_d_prerun b/additional-modules/god/templates/debian/init_d_prerun similarity index 100% rename from shared/additional-modules/god/templates/debian/init_d_prerun rename to additional-modules/god/templates/debian/init_d_prerun diff --git a/shared/additional-modules/god/templates/debian/init_d_prolog b/additional-modules/god/templates/debian/init_d_prolog similarity index 100% rename from shared/additional-modules/god/templates/debian/init_d_prolog rename to additional-modules/god/templates/debian/init_d_prolog diff --git a/shared/additional-modules/god/templates/god-init.d b/additional-modules/god/templates/god-init.d similarity index 100% rename from shared/additional-modules/god/templates/god-init.d rename to additional-modules/god/templates/god-init.d diff --git a/shared/additional-modules/god/templates/redhat/init_d_prerun b/additional-modules/god/templates/redhat/init_d_prerun similarity index 100% rename from shared/additional-modules/god/templates/redhat/init_d_prerun rename to additional-modules/god/templates/redhat/init_d_prerun diff --git a/shared/additional-modules/god/templates/redhat/init_d_prolog b/additional-modules/god/templates/redhat/init_d_prolog similarity index 100% rename from shared/additional-modules/god/templates/redhat/init_d_prolog rename to additional-modules/god/templates/redhat/init_d_prolog diff --git a/shared/additional-modules/nginx-debian/manifests/init.pp b/additional-modules/nginx-debian/manifests/init.pp similarity index 100% rename from shared/additional-modules/nginx-debian/manifests/init.pp rename to additional-modules/nginx-debian/manifests/init.pp diff --git a/shared/additional-modules/nginx-www/manifests/init.pp b/additional-modules/nginx-www/manifests/init.pp similarity index 100% rename from shared/additional-modules/nginx-www/manifests/init.pp rename to additional-modules/nginx-www/manifests/init.pp diff --git a/shared/additional-modules/nginx/manifests/init.pp b/additional-modules/nginx/manifests/init.pp similarity index 100% rename from shared/additional-modules/nginx/manifests/init.pp rename to additional-modules/nginx/manifests/init.pp diff --git a/shared/additional-modules/nginx/templates/fastcgi.conf b/additional-modules/nginx/templates/fastcgi.conf similarity index 100% rename from shared/additional-modules/nginx/templates/fastcgi.conf rename to additional-modules/nginx/templates/fastcgi.conf diff --git a/shared/additional-modules/nginx/templates/fastcgi_params b/additional-modules/nginx/templates/fastcgi_params similarity index 100% rename from shared/additional-modules/nginx/templates/fastcgi_params rename to additional-modules/nginx/templates/fastcgi_params diff --git a/shared/additional-modules/nginx/templates/nginx.conf b/additional-modules/nginx/templates/nginx.conf similarity index 100% rename from shared/additional-modules/nginx/templates/nginx.conf rename to additional-modules/nginx/templates/nginx.conf diff --git a/shared/additional-modules/ruby/manifests/falcon.pp b/additional-modules/ruby/manifests/falcon.pp similarity index 100% rename from shared/additional-modules/ruby/manifests/falcon.pp rename to additional-modules/ruby/manifests/falcon.pp diff --git a/shared/additional-modules/ruby/manifests/init.pp b/additional-modules/ruby/manifests/init.pp similarity index 100% rename from shared/additional-modules/ruby/manifests/init.pp rename to additional-modules/ruby/manifests/init.pp diff --git a/shared/additional-modules/ruby/templates/falcon-patch.sh b/additional-modules/ruby/templates/falcon-patch.sh similarity index 100% rename from shared/additional-modules/ruby/templates/falcon-patch.sh rename to additional-modules/ruby/templates/falcon-patch.sh diff --git a/shared/additional-modules/squid/manifests/debian.pp b/additional-modules/squid/manifests/debian.pp similarity index 100% rename from shared/additional-modules/squid/manifests/debian.pp rename to additional-modules/squid/manifests/debian.pp diff --git a/shared/additional-modules/squid/manifests/init.pp b/additional-modules/squid/manifests/init.pp similarity index 100% rename from shared/additional-modules/squid/manifests/init.pp rename to additional-modules/squid/manifests/init.pp diff --git a/shared/additional-modules/squid/templates/clear-squid-cache b/additional-modules/squid/templates/clear-squid-cache similarity index 100% rename from shared/additional-modules/squid/templates/clear-squid-cache rename to additional-modules/squid/templates/clear-squid-cache diff --git a/shared/additional-modules/squid/templates/configure b/additional-modules/squid/templates/configure similarity index 100% rename from shared/additional-modules/squid/templates/configure rename to additional-modules/squid/templates/configure diff --git a/shared/additional-modules/squid/templates/debian/init-d-prerun b/additional-modules/squid/templates/debian/init-d-prerun similarity index 100% rename from shared/additional-modules/squid/templates/debian/init-d-prerun rename to additional-modules/squid/templates/debian/init-d-prerun diff --git a/shared/additional-modules/squid/templates/debian/init-d-prolog b/additional-modules/squid/templates/debian/init-d-prolog similarity index 100% rename from shared/additional-modules/squid/templates/debian/init-d-prolog rename to additional-modules/squid/templates/debian/init-d-prolog diff --git a/shared/additional-modules/squid/templates/preconfigure b/additional-modules/squid/templates/preconfigure similarity index 100% rename from shared/additional-modules/squid/templates/preconfigure rename to additional-modules/squid/templates/preconfigure diff --git a/shared/additional-modules/squid/templates/squid-init.d b/additional-modules/squid/templates/squid-init.d similarity index 100% rename from shared/additional-modules/squid/templates/squid-init.d rename to additional-modules/squid/templates/squid-init.d diff --git a/shared/additional-modules/tc/manifests/debian.pp b/additional-modules/tc/manifests/debian.pp similarity index 100% rename from shared/additional-modules/tc/manifests/debian.pp rename to additional-modules/tc/manifests/debian.pp diff --git a/shared/additional-modules/tc/manifests/init.pp b/additional-modules/tc/manifests/init.pp similarity index 100% rename from shared/additional-modules/tc/manifests/init.pp rename to additional-modules/tc/manifests/init.pp diff --git a/shared/additional-modules/tc/templates/debian/init-d-prerun b/additional-modules/tc/templates/debian/init-d-prerun similarity index 100% rename from shared/additional-modules/tc/templates/debian/init-d-prerun rename to additional-modules/tc/templates/debian/init-d-prerun diff --git a/shared/additional-modules/tc/templates/debian/init-d-prolog b/additional-modules/tc/templates/debian/init-d-prolog similarity index 100% rename from shared/additional-modules/tc/templates/debian/init-d-prolog rename to additional-modules/tc/templates/debian/init-d-prolog diff --git a/shared/additional-modules/tc/templates/tc-init.d b/additional-modules/tc/templates/tc-init.d similarity index 100% rename from shared/additional-modules/tc/templates/tc-init.d rename to additional-modules/tc/templates/tc-init.d diff --git a/shared/additional-modules/varnish/manifests/init.pp b/additional-modules/varnish/manifests/init.pp similarity index 100% rename from shared/additional-modules/varnish/manifests/init.pp rename to additional-modules/varnish/manifests/init.pp diff --git a/shared/additional-modules/varnish/templates/debian/init_d_prerun b/additional-modules/varnish/templates/debian/init_d_prerun similarity index 100% rename from shared/additional-modules/varnish/templates/debian/init_d_prerun rename to additional-modules/varnish/templates/debian/init_d_prerun diff --git a/shared/additional-modules/varnish/templates/debian/init_d_prolog b/additional-modules/varnish/templates/debian/init_d_prolog similarity index 100% rename from shared/additional-modules/varnish/templates/debian/init_d_prolog rename to additional-modules/varnish/templates/debian/init_d_prolog diff --git a/shared/additional-modules/varnish/templates/default b/additional-modules/varnish/templates/default similarity index 100% rename from shared/additional-modules/varnish/templates/default rename to additional-modules/varnish/templates/default diff --git a/shared/additional-modules/varnish/templates/redhat/init_d_prerun b/additional-modules/varnish/templates/redhat/init_d_prerun similarity index 100% rename from shared/additional-modules/varnish/templates/redhat/init_d_prerun rename to additional-modules/varnish/templates/redhat/init_d_prerun diff --git a/shared/additional-modules/varnish/templates/redhat/init_d_prolog b/additional-modules/varnish/templates/redhat/init_d_prolog similarity index 100% rename from shared/additional-modules/varnish/templates/redhat/init_d_prolog rename to additional-modules/varnish/templates/redhat/init_d_prolog diff --git a/shared/additional-modules/varnish/templates/varnish-init.d b/additional-modules/varnish/templates/varnish-init.d similarity index 100% rename from shared/additional-modules/varnish/templates/varnish-init.d rename to additional-modules/varnish/templates/varnish-init.d diff --git a/lib/puppet-standalone-mashup.rb b/lib/puppet-standalone-mashup.rb index 5c25048..df8c0b6 100644 --- a/lib/puppet-standalone-mashup.rb +++ b/lib/puppet-standalone-mashup.rb @@ -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 diff --git a/lib/puppet-standalone-mashup/capistrano.rb b/lib/puppet-standalone-mashup/capistrano.rb index f8a492a..fe79639 100644 --- a/lib/puppet-standalone-mashup/capistrano.rb +++ b/lib/puppet-standalone-mashup/capistrano.rb @@ -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" diff --git a/lib/puppet-standalone-mashup/configuration.rb b/lib/puppet-standalone-mashup/configuration.rb new file mode 100644 index 0000000..4a20242 --- /dev/null +++ b/lib/puppet-standalone-mashup/configuration.rb @@ -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 + diff --git a/lib/puppet-standalone-mashup/provider.rb b/lib/puppet-standalone-mashup/provider.rb new file mode 100644 index 0000000..b502363 --- /dev/null +++ b/lib/puppet-standalone-mashup/provider.rb @@ -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 diff --git a/shared/modules/ssh/manifests/init.pp b/shared/modules/ssh/manifests/init.pp index a717873..92367fa 100644 --- a/shared/modules/ssh/manifests/init.pp +++ b/shared/modules/ssh/manifests/init.pp @@ -5,7 +5,8 @@ define ssh { ensure => directory, mode => '0700', owner => $name, - group => $name + group => $name, + require => User[$name] } file { "${ssh_dir}/authorized_keys": diff --git a/skel/apply.erb b/skel/apply.erb index f3c5f9d..3bac6e5 100644 --- a/skel/apply.erb +++ b/skel/apply.erb @@ -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