puppet-masterless 0.1.2 → 0.1.3

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/puppet-masterless +62 -35
  3. metadata +4 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0ed8aface71827a69d18e16e18084a12cd1549e
4
- data.tar.gz: 82d1779ed59128a21005e193e9de7fe560ff1034
3
+ metadata.gz: 682169b63eab3d891e86b9fc6132e9825b20d9f5
4
+ data.tar.gz: 3279bdb87fa815b546a23090248781c05c0f4dc2
5
5
  SHA512:
6
- metadata.gz: 49e7baee997edcc61bbc3d1e3b9e46bce2713848c8bd45bad16bbbd8b4f5512c1aaf543257c4e59bc8ee402433ec0be9bba01ef250deba9702ef64b1d4a31600
7
- data.tar.gz: 57725f0ca6efc3c9fbf15e48ac637a5a26de792e6301f34e9543f13147cf8dbd003ef09dfead79eafda5b62c3b3d0e958e64e3a30f9c80b305a827224210682d
6
+ metadata.gz: cbd29e8b824afa0448cfb7574340be0ba30b8aa5ec95692686cdc1fe23f96f4a1f937bac8361af327298080230ffb0596270bd69112f09025ab41457a0726a55
7
+ data.tar.gz: f9cfa98d18f4127270ed7eebb8c8f033eeea74be08f95404751884a406347f47cfdb656675c080dfdb768a66eb5954ef01f4bd5eec38cd60f1ef694fb9e94331
@@ -1,37 +1,58 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Usage: puppet-masterless <command> [<argument> ...] [-- puppet arguments ...]
3
+ # Copyright (c) 2017-2018 Catalyst.net Ltd
4
4
  #
5
- # Applies a local puppet project to a remote host.
5
+ # This file is part of puppet-masterless.
6
6
  #
7
- # Available commands:
7
+ # puppet-masterless is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
8
11
  #
9
- # apply - apply a project to a remote host
10
- # package - package a project as a shell script
12
+ # puppet-masterless is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ # General Public License for more details.
11
16
  #
12
- # Available arguments:
13
- #
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
23
- #
24
- # At least "confdir" must be specified.
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with puppet-masterless. If not, see http://www.gnu.org/licenses/
25
19
  #
26
20
 
27
21
  require 'fileutils'
28
- require 'shellwords'
29
22
  require 'securerandom'
23
+ require 'shellwords'
24
+
25
+ #|
26
+ #| Usage: puppet-masterless <command> [<argument> ...] [-- puppet arguments ...]
27
+ #|
28
+ #| Applies a local puppet project to a remote host.
29
+ #|
30
+ #| Available commands:
31
+ #|
32
+ #| apply - apply a project to a remote host
33
+ #| package - package a project as a shell script
34
+ #|
35
+ #| Available arguments:
36
+ #|
37
+ #| confdir <pathname> - main project directory
38
+ #| manifest <filename> - manifest to apply
39
+ #| hiera_config <filename> - passed to --hiera_config
40
+ #| modulepath <pathname> - passed to --modulepath
41
+ #| to <hostname> - hostname of remote machine
42
+ #| puppet <executable> - location of puppet executable on remote host
43
+ #| sudo <command> - location of sudo executable on remote host
44
+ #| as <username> - name of user running puppet-apply
45
+ #| file <filename> - add file or directory to package
46
+ #| output file <filename> - output filename for package
47
+ #|
48
+ #| At least "confdir" must be specified.
49
+ #|
30
50
 
31
51
  module PuppetMasterless
32
52
  ARCHIVE_NAME = 'puppet-package'
33
53
  ARCHIVE_OPTIONS = '--ignore-failed-read --exclude-vcs'
34
54
  DEFAULT_PUPPET = 'puppet'
55
+ DEFAULT_SUDO = 'sudo'
35
56
  REMOTE_USER = 'root'
36
57
  REMOTE_WORKDIR = '/tmp'
37
58
 
@@ -41,6 +62,7 @@ module PuppetMasterless
41
62
  @args = []
42
63
  @path = ARCHIVE_NAME
43
64
  @puppet = DEFAULT_PUPPET
65
+ @sudo = DEFAULT_SUDO
44
66
  @user = REMOTE_USER
45
67
  @workdir = REMOTE_WORKDIR
46
68
  @output = "#{ARCHIVE_NAME}-#{SecureRandom.hex(4)}"
@@ -60,6 +82,7 @@ module PuppetMasterless
60
82
  when 'modulepath' then @modulepath = args.shift
61
83
  when 'hiera_config' then @hiera_config = args.shift
62
84
  when 'puppet' then @puppet = args.shift
85
+ when 'sudo' then @sudo = args.shift
63
86
  when 'to' then @hostname = args.shift
64
87
  when 'as' then @user = args.shift
65
88
  when 'file' then @files << args.shift
@@ -75,17 +98,24 @@ module PuppetMasterless
75
98
  fail 'No puppet specified' unless @puppet
76
99
  fail 'No output file specified' unless @output
77
100
 
78
- @manifest ||= File.join(@confdir, 'manifests')
79
- @modulepath ||= File.join(@confdir, 'modules')
80
- @hiera_config ||= File.join(@confdir, 'hiera.yaml')
81
- @hieradata ||= File.join(@confdir, 'hieradata')
101
+ modules = File.join(@confdir, 'modules')
102
+ manifests = File.join(@confdir, 'manifests')
103
+ hieradata = File.join(@confdir, 'hieradata')
104
+ hiera_yaml = File.join(@confdir, 'hiera.yaml')
105
+ puppet_conf = File.join(@confdir, 'puppet.conf')
106
+
107
+ @manifest ||= manifests
108
+ @modulepath ||= modules
109
+ @hiera_config ||= hiera_yaml
82
110
 
83
111
  fail 'No such confdir: ' << @confdir unless File.directory?(@confdir)
84
112
  fail 'No such manifest: ' << @manifest unless File.exist?(@manifest)
85
113
 
114
+ @files << hieradata if File.directory?(hieradata)
115
+ @files << puppet_conf if File.file?(puppet_conf)
116
+
86
117
  @modulepath = nil unless File.directory?(@modulepath)
87
118
  @hiera_config = nil unless File.file?(@hiera_config)
88
- @hieradata = nil unless File.directory?(@hieradata)
89
119
  end
90
120
 
91
121
  def package
@@ -99,7 +129,7 @@ module PuppetMasterless
99
129
  private
100
130
 
101
131
  def banner
102
- File.read(__FILE__).lines[1..24].map { |s| s.gsub(/^# ?/, '') }
132
+ File.read(__FILE__).lines.grep(/^#\|/).map { |s| s.gsub(/^#\| ?/, '') }
103
133
  end
104
134
 
105
135
  def collect_output(args)
@@ -113,23 +143,19 @@ module PuppetMasterless
113
143
  command << ' ' << @manifest.shellescape
114
144
  command << ' ' << @modulepath.shellescape if @modulepath
115
145
  command << ' ' << @hiera_config.shellescape if @hiera_config
116
- command << ' ' << @hieradata.shellescape if @hieradata
117
146
  command << ' | gzip -f'
118
147
  end
119
148
 
120
149
  def local_apply_command
121
- command = "exec #{@puppet} apply #{@manifest.shellescape} --verbose --show_diff --color true --confdir #{@confdir.shellescape}"
150
+ command = "#{@puppet} apply #{@manifest.shellescape} --verbose --show_diff --color true"
151
+ command << ' --confdir ' << @confdir.shellescape
122
152
  command << ' --modulepath ' << @modulepath.shellescape if @modulepath
123
153
  command << ' --hiera_config ' << @hiera_config.shellescape if @hiera_config
124
154
  command << ' ' << @args.shelljoin
125
155
  end
126
156
 
127
157
  def remote_apply_command
128
- "sudo -u #{@user.shellescape} #{@workdir.shellescape}/#{@output.shellescape}"
129
- end
130
-
131
- def remote_cleanup_command
132
- "sudo -u #{@user.shellescape} rm -f #{@workdir.shellescape}/#{@output.shellescape} -r #{@workdir.shellescape}/#{@path.shellescape}"
158
+ "#{@sudo} -u #{@user.shellescape} #{@workdir.shellescape}/#{@output.shellescape}"
133
159
  end
134
160
 
135
161
  def apply_local
@@ -148,7 +174,7 @@ module PuppetMasterless
148
174
  fail 'Apply command failed' unless system("ssh -q -t #{@hostname.shellescape} #{remote_apply_command.shellescape}")
149
175
  ensure
150
176
  FileUtils.rm_f(@output)
151
- system("ssh -q -t #{@hostname.shellescape} #{remote_cleanup_command.shellescape}")
177
+ system("ssh -q -t #{@hostname.shellescape} rm -f #{@workdir.shellescape}/#{@output.shellescape}")
152
178
  end
153
179
 
154
180
  def create_distribution
@@ -156,10 +182,11 @@ module PuppetMasterless
156
182
  o.puts('#!/bin/sh -e')
157
183
  o.puts('umask 077')
158
184
  o.puts('cd "$(dirname "$0")"')
159
- o.puts('sed "0,/^# EOF$/d" "$0" | gunzip -f | tar -xf-')
185
+ o.puts('trap "rm -rf ' << @workdir.shellescape << '/' << @path.shellescape << '" EXIT')
186
+ o.puts('sed -n 10,\\$p "$0" | gunzip -f | tar -xf-')
160
187
  o.puts('cd ' << @path.shellescape)
161
188
  o.puts(local_apply_command)
162
- o.puts('exit 1')
189
+ o.puts('exit 0')
163
190
  o.puts('# EOF')
164
191
  o.chmod(0755)
165
192
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet-masterless
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Hanson
@@ -10,8 +10,7 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2018-01-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Packages and optionally applies a multi-file Puppet project to a remote
14
- host via SSH.
13
+ description: Packages and applies a Puppet project to a remote host.
15
14
  email: evanh@catalyst.net.nz
16
15
  executables:
17
16
  - puppet-masterless
@@ -19,7 +18,7 @@ extensions: []
19
18
  extra_rdoc_files: []
20
19
  files:
21
20
  - bin/puppet-masterless
22
- homepage: https://gitlab.wgtn.cat-it.co.nz/devtools/puppet-masterless
21
+ homepage: https://gitlab.com/catalyst-it/puppet-masterless
23
22
  licenses:
24
23
  - GPLv3
25
24
  metadata: {}
@@ -42,5 +41,5 @@ rubyforge_project:
42
41
  rubygems_version: 2.6.12
43
42
  signing_key:
44
43
  specification_version: 4
45
- summary: Apply a local puppet project to a remote host
44
+ summary: Apply a local Puppet project to a remote host
46
45
  test_files: []