puppet-masterless 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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")
|