puppet-masterless 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/bin/puppet-masterless +48 -35
- metadata +1 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 03f3fd21ff83a4bdfef031806d9134d1d8279d04
         | 
| 4 | 
            +
              data.tar.gz: 366fcad2a93d6c24087b0df3c7c745f6efbf5491
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2a3cbf2eb8168f8c56375ec18baa5bea255ce27e38f4703619509afd58e840af0b3fd884431ff69a034f87c3b1c330f20db5a4377c26d0743cf20d44a1f7403d
         | 
| 7 | 
            +
              data.tar.gz: bcd1344c6424166090cb441f9631a7ba3dee033361d1f0d05dc6292d94fbeae5c35c4c5904f80a6646a045aa9d42ce0898c10d0bc21aee8018983e967cc59d24
         | 
    
        data/bin/puppet-masterless
    CHANGED
    
    | @@ -1,32 +1,35 @@ | |
| 1 1 | 
             
            #!/usr/bin/env ruby
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            # Usage: puppet-masterless < | 
| 3 | 
            +
            # Usage: puppet-masterless <command> [<argument> ...] [-- puppet arguments ...]
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # Applies a local puppet project to a remote host.
         | 
| 6 6 | 
             
            #
         | 
| 7 | 
            -
            # Available  | 
| 7 | 
            +
            # Available commands:
         | 
| 8 8 | 
             
            #
         | 
| 9 | 
            -
            #    | 
| 10 | 
            -
            #    | 
| 9 | 
            +
            #   apply                     - apply a project to a remote host
         | 
| 10 | 
            +
            #   package                   - package a project as a shell script
         | 
| 11 11 | 
             
            #
         | 
| 12 12 | 
             
            # Available arguments:
         | 
| 13 13 | 
             
            #
         | 
| 14 | 
            -
            #   confdir <directory | 
| 15 | 
            -
            #    | 
| 16 | 
            -
            #    | 
| 17 | 
            -
            #   modulepath < | 
| 18 | 
            -
            #   puppet <executable>
         | 
| 19 | 
            -
            #   to <hostname>
         | 
| 20 | 
            -
            #   as <username>
         | 
| 21 | 
            -
            #   file <file | 
| 14 | 
            +
            #   confdir <pathname>        - main project directory
         | 
| 15 | 
            +
            #   manifest <filename>       - manifest to apply
         | 
| 16 | 
            +
            #   hiera_config <filename>   - passed to --hiera_config
         | 
| 17 | 
            +
            #   modulepath <pathname>     - passed to --modulepath
         | 
| 18 | 
            +
            #   puppet <executable>       - location of puppet executable
         | 
| 19 | 
            +
            #   to <hostname>             - hostname of remote machine
         | 
| 20 | 
            +
            #   as <username>             - name of user running puppet-apply
         | 
| 21 | 
            +
            #   file <filename>           - include a file or directory
         | 
| 22 | 
            +
            #   output file <filename>    - output filename
         | 
| 22 23 | 
             
            #
         | 
| 23 | 
            -
            # At least  | 
| 24 | 
            +
            # At least "confdir" must be specified.
         | 
| 24 25 | 
             
            #
         | 
| 25 26 |  | 
| 27 | 
            +
            require 'fileutils'
         | 
| 26 28 | 
             
            require 'shellwords'
         | 
| 29 | 
            +
            require 'securerandom'
         | 
| 27 30 |  | 
| 28 31 | 
             
            module PuppetMasterless
         | 
| 29 | 
            -
              ARCHIVE_NAME = 'puppet- | 
| 32 | 
            +
              ARCHIVE_NAME = 'puppet-package'
         | 
| 30 33 | 
             
              ARCHIVE_OPTIONS = '--ignore-failed-read --exclude-vcs'
         | 
| 31 34 | 
             
              DEFAULT_PUPPET = 'puppet'
         | 
| 32 35 | 
             
              REMOTE_USER = 'root'
         | 
| @@ -40,19 +43,15 @@ module PuppetMasterless | |
| 40 43 | 
             
                  @puppet = DEFAULT_PUPPET
         | 
| 41 44 | 
             
                  @user = REMOTE_USER
         | 
| 42 45 | 
             
                  @workdir = REMOTE_WORKDIR
         | 
| 43 | 
            -
                  @output = "#{ARCHIVE_NAME}. | 
| 46 | 
            +
                  @output = "#{ARCHIVE_NAME}-#{SecureRandom.hex(4)}"
         | 
| 44 47 | 
             
                end
         | 
| 45 48 |  | 
| 46 | 
            -
                def  | 
| 47 | 
            -
                  File.read(__FILE__).lines[1..23].map { |s| s.gsub(/^# ?/, '') }
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                def usage n = 1
         | 
| 49 | 
            +
                def usage(n = 1)
         | 
| 51 50 | 
             
                  STDERR.puts(banner)
         | 
| 52 51 | 
             
                  exit(n)
         | 
| 53 52 | 
             
                end
         | 
| 54 53 |  | 
| 55 | 
            -
                def collect | 
| 54 | 
            +
                def collect(args)
         | 
| 56 55 | 
             
                  while word = args.shift
         | 
| 57 56 | 
             
                    case word
         | 
| 58 57 | 
             
                    when 'with', 'and'
         | 
| @@ -65,6 +64,7 @@ module PuppetMasterless | |
| 65 64 | 
             
                    when 'as' then @user = args.shift
         | 
| 66 65 | 
             
                    when 'file' then @files << args.shift
         | 
| 67 66 | 
             
                    when '--', nil then @args = args.slice!(0..-1)
         | 
| 67 | 
            +
                    when 'output' then collect_output(args)
         | 
| 68 68 | 
             
                    else fail 'Invalid argument: ' << word
         | 
| 69 69 | 
             
                    end
         | 
| 70 70 | 
             
                  end
         | 
| @@ -73,16 +73,19 @@ module PuppetMasterless | |
| 73 73 | 
             
                def validate
         | 
| 74 74 | 
             
                  fail 'No confdir specified' unless @confdir
         | 
| 75 75 | 
             
                  fail 'No puppet specified' unless @puppet
         | 
| 76 | 
            +
                  fail 'No output file specified' unless @output
         | 
| 76 77 |  | 
| 77 78 | 
             
                  @manifest ||= File.join(@confdir, 'manifests')
         | 
| 78 79 | 
             
                  @modulepath ||= File.join(@confdir, 'modules')
         | 
| 79 80 | 
             
                  @hiera_config ||= File.join(@confdir, 'hiera.yaml')
         | 
| 81 | 
            +
                  @hieradata ||= File.join(@confdir, 'hieradata')
         | 
| 80 82 |  | 
| 81 83 | 
             
                  fail 'No such confdir: ' << @confdir unless File.directory?(@confdir)
         | 
| 82 84 | 
             
                  fail 'No such manifest: ' << @manifest unless File.exist?(@manifest)
         | 
| 83 85 |  | 
| 84 86 | 
             
                  @modulepath = nil unless File.directory?(@modulepath)
         | 
| 85 87 | 
             
                  @hiera_config = nil unless File.file?(@hiera_config)
         | 
| 88 | 
            +
                  @hieradata = nil unless File.directory?(@hieradata)
         | 
| 86 89 | 
             
                end
         | 
| 87 90 |  | 
| 88 91 | 
             
                def package
         | 
| @@ -90,22 +93,28 @@ module PuppetMasterless | |
| 90 93 | 
             
                end
         | 
| 91 94 |  | 
| 92 95 | 
             
                def apply
         | 
| 93 | 
            -
                   | 
| 94 | 
            -
                    create_distribution
         | 
| 95 | 
            -
                    apply_remote
         | 
| 96 | 
            -
                  else
         | 
| 97 | 
            -
                    apply_local
         | 
| 98 | 
            -
                  end
         | 
| 96 | 
            +
                  @hostname ? apply_remote : apply_local
         | 
| 99 97 | 
             
                end
         | 
| 100 98 |  | 
| 101 99 | 
             
              private
         | 
| 102 100 |  | 
| 101 | 
            +
                def banner
         | 
| 102 | 
            +
                  File.read(__FILE__).lines[1..24].map { |s| s.gsub(/^# ?/, '') }
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                def collect_output(args)
         | 
| 106 | 
            +
                  usage(1) unless args.shift == 'file'
         | 
| 107 | 
            +
                  @output = args.shift
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 103 110 | 
             
                def archive_command
         | 
| 104 | 
            -
                  "tar - | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 111 | 
            +
                  command = "tar -cf- #{ARCHIVE_OPTIONS} --transform 's|^|#{@path.gsub("'", "'\''")}/|'"
         | 
| 112 | 
            +
                  command << ' ' << @files.shelljoin
         | 
| 113 | 
            +
                  command << ' ' << @manifest.shellescape
         | 
| 114 | 
            +
                  command << ' ' << @modulepath.shellescape if @modulepath
         | 
| 115 | 
            +
                  command << ' ' << @hiera_config.shellescape if @hiera_config
         | 
| 116 | 
            +
                  command << ' ' << @hieradata.shellescape if @hieradata
         | 
| 117 | 
            +
                  command << ' | gzip -f'
         | 
| 109 118 | 
             
                end
         | 
| 110 119 |  | 
| 111 120 | 
             
                def local_apply_command
         | 
| @@ -129,20 +138,24 @@ module PuppetMasterless | |
| 129 138 | 
             
                end
         | 
| 130 139 |  | 
| 131 140 | 
             
                def apply_remote
         | 
| 141 | 
            +
                  STDERR.puts("Notice: Creating distribution")
         | 
| 142 | 
            +
                  create_distribution
         | 
| 143 | 
            +
             | 
| 132 144 | 
             
                  STDERR.puts('Notice: Copying to ' << @hostname)
         | 
| 133 145 | 
             
                  fail 'Copy command failed' unless system("scp -q #{@output.shellescape} #{@hostname.shellescape}:#{@workdir.shellescape}")
         | 
| 146 | 
            +
             | 
| 134 147 | 
             
                  STDERR.puts('Notice: Applying to ' << @hostname)
         | 
| 135 148 | 
             
                  fail 'Apply command failed' unless system("ssh -q -t #{@hostname.shellescape} #{remote_apply_command.shellescape}")
         | 
| 136 149 | 
             
                ensure
         | 
| 150 | 
            +
                  FileUtils.rm_f(@output)
         | 
| 137 151 | 
             
                  system("ssh -q -t #{@hostname.shellescape} #{remote_cleanup_command.shellescape}")
         | 
| 138 152 | 
             
                end
         | 
| 139 153 |  | 
| 140 154 | 
             
                def create_distribution
         | 
| 141 | 
            -
                  STDERR.puts("Notice: Creating distribution")
         | 
| 142 | 
            -
             | 
| 143 155 | 
             
                  File.open(@output, 'w') do |o|
         | 
| 144 156 | 
             
                    o.puts("#!/bin/sh -e")
         | 
| 145 | 
            -
                    o.puts(" | 
| 157 | 
            +
                    o.puts("umask 077")
         | 
| 158 | 
            +
                    o.puts("sed '0,/^# EOF$/d' \"$0\" | gunzip -f | tar -xf-")
         | 
| 146 159 | 
             
                    o.puts("cd #{@path.shellescape}")
         | 
| 147 160 | 
             
                    o.puts(local_apply_command)
         | 
| 148 161 | 
             
                    o.puts("exit 1")
         |