vagrant-pe_build 0.3.0 → 0.4.0
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.
- data/.gitignore +1 -0
- data/CHANGELOG +29 -0
- data/Gemfile +12 -0
- data/README.markdown +1 -2
- data/lib/pe_build/cap/run_install/posix.rb +11 -2
- data/lib/pe_build/config.rb +8 -0
- data/lib/pe_build/config/global.rb +30 -18
- data/lib/pe_build/config/pe_bootstrap.rb +86 -23
- data/lib/pe_build/config_builder.rb +6 -0
- data/lib/pe_build/config_builder/global.rb +37 -0
- data/lib/pe_build/config_builder/pe_bootstrap.rb +29 -0
- data/lib/pe_build/plugin.rb +6 -2
- data/lib/pe_build/provisioner/pe_bootstrap.rb +11 -37
- data/lib/pe_build/provisioner/pe_bootstrap/post_install.rb +108 -0
- data/lib/pe_build/transfer.rb +7 -1
- data/lib/pe_build/version.rb +1 -1
- data/templates/locales/en.yml +33 -0
- metadata +8 -3
- data/templates/scripts/relocate_installation.sh +0 -23
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/doc
|
data/CHANGELOG
CHANGED
@@ -1,6 +1,35 @@
|
|
1
1
|
vagrant-pe_build
|
2
2
|
================
|
3
3
|
|
4
|
+
0.4.0
|
5
|
+
-----
|
6
|
+
|
7
|
+
This is a backwards compatible feature and bugfix release.
|
8
|
+
|
9
|
+
### User notes:
|
10
|
+
|
11
|
+
#### Enhancements
|
12
|
+
|
13
|
+
* New pe_bootstrap configuration option: `autosign` adds the ability to
|
14
|
+
configure the Puppet master autosign.conf
|
15
|
+
|
16
|
+
#### Bugfixes
|
17
|
+
|
18
|
+
* The pe_bootstrap provisioner restarts the pe-httpd service if changes were
|
19
|
+
made to the master configuration that require a restart.
|
20
|
+
|
21
|
+
### Developer notes:
|
22
|
+
|
23
|
+
* pe_bootstrap post-install configuration has been extracted out of the
|
24
|
+
provisioner and into the PostInstall module.
|
25
|
+
* post-install configuration is now handled by generating a Puppet manifest
|
26
|
+
instead of executing sed and a shell script.
|
27
|
+
|
28
|
+
### Thanks
|
29
|
+
|
30
|
+
Thanks to Tom Linkin for his work on handling post-install configuration with
|
31
|
+
Augeas and Puppet.
|
32
|
+
|
4
33
|
0.3.0
|
5
34
|
-----
|
6
35
|
|
data/Gemfile
CHANGED
@@ -1,3 +1,15 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gemspec
|
4
|
+
|
5
|
+
group :doc do
|
6
|
+
gem 'yard', '~> 0.8.7'
|
7
|
+
gem 'redcarpet'
|
8
|
+
end
|
9
|
+
|
10
|
+
group :development do
|
11
|
+
# We depend on Vagrant for development, but we don't add it as a
|
12
|
+
# gem dependency because we expect to be installed within the
|
13
|
+
# Vagrant environment itself using `vagrant plugin`.
|
14
|
+
gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
|
15
|
+
end
|
data/README.markdown
CHANGED
@@ -168,8 +168,7 @@ added with `vagrant pe-build copy`.
|
|
168
168
|
config.vm.define 'agent1' do |node|
|
169
169
|
node.vm.box = 'centos-6-i386'
|
170
170
|
|
171
|
-
node.vm.provision :pe_bootstrap
|
172
|
-
provisioner.role = :agent end
|
171
|
+
node.vm.provision :pe_bootstrap
|
173
172
|
end
|
174
173
|
end
|
175
174
|
|
@@ -5,6 +5,12 @@ class PEBuild::Cap::RunInstall::POSIX
|
|
5
5
|
|
6
6
|
def self.run_install(machine, config, archive)
|
7
7
|
|
8
|
+
if machine.communicate.test('test -f /opt/puppet/pe_version')
|
9
|
+
machine.ui.warn I18n.t('pebuild.cap.run_install.posix..already_installed'),
|
10
|
+
:name => machine.name
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
8
14
|
root = File.join('/vagrant', PEBuild::WORK_DIR)
|
9
15
|
|
10
16
|
cmd_path = []
|
@@ -20,7 +26,10 @@ class PEBuild::Cap::RunInstall::POSIX
|
|
20
26
|
|
21
27
|
on_machine(machine, argv)
|
22
28
|
|
23
|
-
|
24
|
-
machine.communicate.
|
29
|
+
|
30
|
+
if machine.communicate.test('which at')
|
31
|
+
machine.ui.info I18n.t('pebuild.provisioner.pe_bootstrap.scheduling_run')
|
32
|
+
machine.communicate.sudo("echo '/opt/puppet/bin/puppet agent -t --waitforcert 10' | at next minute")
|
33
|
+
end
|
25
34
|
end
|
26
35
|
end
|
@@ -1,13 +1,9 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'vagrant'
|
3
|
-
|
4
1
|
require 'pe_build/config_default'
|
5
2
|
require 'pe_build/transfer'
|
6
3
|
|
7
|
-
|
8
|
-
module Config
|
4
|
+
require 'uri'
|
9
5
|
|
10
|
-
class Global < Vagrant.plugin('2', :config)
|
6
|
+
class PEBuild::Config::Global < Vagrant.plugin('2', :config)
|
11
7
|
|
12
8
|
# @todo This value should be discovered based on what versions of the
|
13
9
|
# installer are cached.
|
@@ -57,32 +53,48 @@ class Global < Vagrant.plugin('2', :config)
|
|
57
53
|
def validate(machine)
|
58
54
|
errors = []
|
59
55
|
|
56
|
+
validate_version(errors)
|
57
|
+
validate_download_root(errors)
|
58
|
+
|
59
|
+
{"PE build global config" => errors}
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def validate_version(version)
|
65
|
+
|
66
|
+
errmsg = I18n.t(
|
67
|
+
'pebuild.config.global.errors.malformed_version',
|
68
|
+
:version => @version,
|
69
|
+
:version_class => @version.class
|
70
|
+
)
|
71
|
+
|
60
72
|
# Allow Global version to be unset, rendering it essentially optional. If it is
|
61
73
|
# discovered to be unset by a configuration on the next level up who cannot provide a
|
62
74
|
# value, it is that configuration's job to take action.
|
63
|
-
if @version.kind_of? String
|
64
|
-
|
65
|
-
errors << "version must be a valid version string, got #{@version.inspect}"
|
66
|
-
end
|
75
|
+
if @version.kind_of? String and !(@version.match /\d+\.\d+(\.\d+)?/)
|
76
|
+
errors << errmsg
|
67
77
|
elsif @version != UNSET_VALUE
|
68
|
-
errors <<
|
78
|
+
errors << errmsg
|
69
79
|
end
|
80
|
+
end
|
70
81
|
|
82
|
+
def validate_download_root(errors)
|
71
83
|
if @download_root and @download_root != UNSET_VALUE
|
72
84
|
begin
|
73
85
|
uri = URI.parse(@download_root)
|
74
86
|
|
75
87
|
if PEBuild::Transfer::IMPLEMENTATIONS[uri.scheme].nil?
|
76
|
-
errors <<
|
88
|
+
errors << I18n.t(
|
89
|
+
'pebuild.config.global.errors.unhandled_download_root_scheme',
|
90
|
+
:download_root => @download_root,
|
91
|
+
:scheme => uri.scheme,
|
92
|
+
:supported => PEBuild::Transfer::IMPLEMENTATIONS.keys
|
93
|
+
)
|
77
94
|
end
|
78
95
|
rescue URI::InvalidURIError
|
79
|
-
errors << '
|
96
|
+
errors << I18n.t('pebuild.config.global.errors.invalid_download_root_uri')
|
80
97
|
end
|
81
98
|
end
|
82
|
-
|
83
|
-
{"PE Build global config" => errors}
|
84
99
|
end
|
85
100
|
end
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
@@ -1,42 +1,59 @@
|
|
1
|
-
require 'vagrant'
|
2
|
-
|
3
1
|
require 'pe_build/config/global'
|
4
|
-
require 'pe_build/config_default'
|
5
|
-
|
6
|
-
module PEBuild
|
7
|
-
module Config
|
8
2
|
|
9
|
-
class PEBootstrap < PEBuild::Config::Global
|
3
|
+
class PEBuild::Config::PEBootstrap < PEBuild::Config::Global
|
10
4
|
|
11
5
|
# @!attribute master
|
12
|
-
# @return The DNS hostname of the Puppet master for this node.
|
6
|
+
# @return [String] The DNS hostname of the Puppet master for this node.
|
7
|
+
# @since 0.1.0
|
13
8
|
attr_accessor :master
|
14
9
|
|
15
10
|
# @!attribute answer_file
|
16
11
|
# @return [String] The path to a user specified answer_file file (Optional)
|
12
|
+
# @since 0.1.0
|
17
13
|
attr_accessor :answer_file
|
18
14
|
|
19
15
|
# @!attribute verbose
|
20
16
|
# @return [TrueClass, FalseClass] if stdout will be displayed when installing
|
17
|
+
# @since 0.1.0
|
21
18
|
attr_accessor :verbose
|
22
19
|
|
23
20
|
# @!attribute role
|
24
21
|
# @return [Symbol] The type of the PE installation role. One of [:master, :agent]
|
22
|
+
# @since 0.1.0
|
25
23
|
attr_accessor :role
|
24
|
+
|
25
|
+
# @api private
|
26
26
|
VALID_ROLES = [:agent, :master]
|
27
27
|
|
28
28
|
# @!attribute step
|
29
29
|
# @return [Hash<Symbol, String>] a hash whose keys are step levels, and whose
|
30
30
|
# keys are directories to optional steps.
|
31
|
+
# @deprecated This duplicates the behavior of the shell provider and will
|
32
|
+
# be removed in a future release.
|
33
|
+
# @since 0.1.0
|
31
34
|
attr_accessor :step
|
32
35
|
|
33
|
-
attr_accessor :relocate_manifests
|
34
36
|
# @!attribute relocate_manifests
|
35
37
|
# @return [TrueClass, FalseClass] if the puppet master should use manifests
|
36
38
|
# out of the vagrant directory.
|
39
|
+
# @since 0.1.0
|
40
|
+
attr_accessor :relocate_manifests
|
37
41
|
|
38
|
-
#
|
39
|
-
#
|
42
|
+
# @!attribute [rw] autosign
|
43
|
+
# Configure the certificates that will be autosigned by the puppet master.
|
44
|
+
#
|
45
|
+
# @return [TrueClass] All CSRs will be signed
|
46
|
+
# @return [FalseClass] The autosign config file will be unmanaged
|
47
|
+
# @return [Array<String>] CSRs with the given addresses
|
48
|
+
#
|
49
|
+
# @see http://docs.puppetlabs.com/guides/configuring.html#autosignconf
|
50
|
+
#
|
51
|
+
# @since 0.4.0
|
52
|
+
#
|
53
|
+
attr_accessor :autosign
|
54
|
+
|
55
|
+
# @api private
|
56
|
+
VALID_AUTOSIGN_VALUES = [TrueClass, FalseClass, Array]
|
40
57
|
|
41
58
|
def initialize
|
42
59
|
super
|
@@ -47,7 +64,7 @@ class PEBootstrap < PEBuild::Config::Global
|
|
47
64
|
|
48
65
|
@relocate_manifests = UNSET_VALUE
|
49
66
|
|
50
|
-
|
67
|
+
@autosign = UNSET_VALUE
|
51
68
|
|
52
69
|
@step = {}
|
53
70
|
end
|
@@ -64,53 +81,101 @@ class PEBootstrap < PEBuild::Config::Global
|
|
64
81
|
set_default :@verbose, true
|
65
82
|
set_default :@master, 'master'
|
66
83
|
set_default :@answer_file, nil
|
84
|
+
set_default :@autosign, (@role == :master)
|
67
85
|
|
68
86
|
set_default :@relocate_manifests, false
|
69
87
|
end
|
70
88
|
|
89
|
+
# @deprecated This duplicates the behavior of the shell provider and will
|
90
|
+
# be removed in a future release.
|
71
91
|
def add_step(name, script_path)
|
72
92
|
name = (name.is_a?(Symbol)) ? name : name.intern
|
73
93
|
step[name] = script_path
|
74
94
|
end
|
75
95
|
|
76
|
-
# @
|
96
|
+
# @param machine [Vagrant::Machine]
|
77
97
|
def validate(machine)
|
78
98
|
h = super
|
79
99
|
|
80
100
|
unless @step.empty?
|
81
|
-
machine.ui.warn
|
101
|
+
machine.ui.warn I18n.t('pebuild.config.pe_bootstrap.steps_deprecated')
|
82
102
|
end
|
83
103
|
|
84
104
|
errors = []
|
105
|
+
|
106
|
+
validate_version(errors)
|
107
|
+
validate_role(errors)
|
108
|
+
validate_verbose(errors)
|
109
|
+
validate_master(errors)
|
110
|
+
validate_answer_file(errors)
|
111
|
+
validate_relocate_manifests(errors)
|
112
|
+
validate_autosign(errors)
|
113
|
+
|
114
|
+
errors |= h.values.flatten
|
115
|
+
{"PE Bootstrap" => errors}
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
def validate_version(errors)
|
85
121
|
if @version == UNSET_VALUE and global_config_from(machine).pe_build.version == UNSET_VALUE
|
86
|
-
errors <<
|
122
|
+
errors << I18n.t('pebuild.config.pe_bootstrap.errors.unset_version')
|
87
123
|
end
|
124
|
+
end
|
88
125
|
|
126
|
+
def validate_role(errors)
|
89
127
|
unless VALID_ROLES.any? {|sym| @role == sym}
|
90
|
-
errors <<
|
128
|
+
errors << I18n.t(
|
129
|
+
'pebuild.config.pe_bootstrap.errors.unhandled_role',
|
130
|
+
:role => @role.inspect,
|
131
|
+
:known_roles => VALID_ROLES,
|
132
|
+
)
|
91
133
|
end
|
134
|
+
end
|
92
135
|
|
136
|
+
def validate_verbose(errors)
|
93
137
|
unless @verbose == !!@verbose
|
94
|
-
errors <<
|
138
|
+
errors << I18n.t(
|
139
|
+
'pebuild.config.pe_bootstrap.errors.malformed_verbose',
|
140
|
+
:verbose => @verbose.inspect,
|
141
|
+
)
|
95
142
|
end
|
143
|
+
end
|
96
144
|
|
145
|
+
def validate_master(errors)
|
97
146
|
unless @master.is_a? String
|
98
147
|
errors << "'master' must be a string containing the address of the master, got a #{@master.class}"
|
99
148
|
end
|
149
|
+
end
|
100
150
|
|
151
|
+
def validate_answer_file(errors)
|
101
152
|
if @answer_file and !File.readable? @answer_file
|
102
153
|
errors << "'answers_file' must be a readable file"
|
103
154
|
end
|
155
|
+
end
|
104
156
|
|
157
|
+
def validate_relocate_manifests(errors)
|
105
158
|
if @relocate_manifests and not @role == :master
|
106
159
|
errors << "'relocate_manifests' can only be applied to a master"
|
107
160
|
end
|
108
|
-
|
109
|
-
errors |= h.values.flatten
|
110
|
-
{"PE Bootstrap" => errors}
|
111
161
|
end
|
112
162
|
|
113
|
-
|
163
|
+
def validate_autosign(errors)
|
164
|
+
if (@autosign and @role != :master)
|
165
|
+
errors << I18n.t(
|
166
|
+
'pebuild.config.pe_bootstrap.errors.invalid_autosign_role',
|
167
|
+
:role => @role
|
168
|
+
)
|
169
|
+
end
|
170
|
+
|
171
|
+
unless VALID_AUTOSIGN_VALUES.include?(@autosign.class)
|
172
|
+
errors << I18n.t(
|
173
|
+
'pebuild.config.pe_bootstrap.errors.invalid_autosign_class',
|
174
|
+
:autosign_class => @autosign.class,
|
175
|
+
:autosign_classes => VALID_AUTOSIGN_VALUES,
|
176
|
+
)
|
177
|
+
end
|
178
|
+
end
|
114
179
|
|
115
180
|
# Safely access the global config
|
116
181
|
#
|
@@ -121,5 +186,3 @@ class PEBootstrap < PEBuild::Config::Global
|
|
121
186
|
env = machine.env.config_global
|
122
187
|
end
|
123
188
|
end
|
124
|
-
end
|
125
|
-
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'config_builder/model'
|
2
|
+
|
3
|
+
class PEBuild::ConfigBuilder::Global < ::ConfigBuilder::Model::Base
|
4
|
+
|
5
|
+
# @!attribute [rw] download_root
|
6
|
+
def_model_attribute :download_root
|
7
|
+
|
8
|
+
# @!attribute [rw] version
|
9
|
+
def_model_attribute :version
|
10
|
+
|
11
|
+
# @!attribute [rw] suffix
|
12
|
+
def_model_attribute :suffix
|
13
|
+
|
14
|
+
# @!attribute [rw] filename
|
15
|
+
def_model_attribute :filename
|
16
|
+
|
17
|
+
def to_proc
|
18
|
+
Proc.new do |global_config|
|
19
|
+
global_config.pe_build.download_root = attr(:download_root) if attr(:download_root)
|
20
|
+
global_config.pe_build.version = attr(:version) if attr(:version)
|
21
|
+
global_config.pe_build.suffix = attr(:suffix) if attr(:suffix)
|
22
|
+
global_config.pe_build.filename = attr(:filename) if attr(:filename)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ConfigBuilder::Model::Root
|
28
|
+
def_model_delegator :pe_build
|
29
|
+
|
30
|
+
def eval_pe_build(root_config)
|
31
|
+
if attr(:pe_build)
|
32
|
+
p = PEBuild::ConfigBuilder::Global.new_from_hash(attr(:pe_build))
|
33
|
+
p.call(root_config)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
private :eval_pe_build
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'config_builder/model'
|
2
|
+
|
3
|
+
class PEBuild::ConfigBuilder::PEBootstrap < ::PEBuild::ConfigBuilder::Global
|
4
|
+
|
5
|
+
def_model_attribute :master
|
6
|
+
def_model_attribute :answer_file
|
7
|
+
|
8
|
+
def_model_attribute :verbose
|
9
|
+
|
10
|
+
def_model_attribute :role
|
11
|
+
#def_model_attribute :step
|
12
|
+
def_model_attribute :relocate_manifests
|
13
|
+
|
14
|
+
def to_proc
|
15
|
+
Proc.new do |vm_config|
|
16
|
+
vm_config.provision :pe_bootstrap do |pe|
|
17
|
+
pe.download_root = attr(:download_root) if attr(:download_root)
|
18
|
+
pe.version = attr(:version) if attr(:version)
|
19
|
+
pe.suffix = attr(:suffix) if attr(:suffix)
|
20
|
+
pe.filename = attr(:filename) if attr(:filename)
|
21
|
+
|
22
|
+
pe.role = attr(:role) if attr(:role)
|
23
|
+
pe.relocate_manifests = attr(:relocate_manifests) if attr(:relocate_manifests)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
::ConfigBuilder::Model::Provisioner.register('pe_bootstrap', self)
|
29
|
+
end
|
data/lib/pe_build/plugin.rb
CHANGED
@@ -18,12 +18,12 @@ module PEBuild
|
|
18
18
|
# User facing plugin configuration
|
19
19
|
|
20
20
|
config(:pe_bootstrap, :provisioner) do
|
21
|
-
require_relative 'config
|
21
|
+
require_relative 'config'
|
22
22
|
PEBuild::Config::PEBootstrap
|
23
23
|
end
|
24
24
|
|
25
25
|
config(:pe_build) do
|
26
|
-
require_relative 'config
|
26
|
+
require_relative 'config'
|
27
27
|
PEBuild::Config::Global
|
28
28
|
end
|
29
29
|
|
@@ -70,5 +70,9 @@ module PEBuild
|
|
70
70
|
require 'pe_build/action'
|
71
71
|
hook.prepend PEBuild::Action::PEBuildDir
|
72
72
|
end
|
73
|
+
|
74
|
+
def self.config_builder_hook
|
75
|
+
require_relative 'config_builder'
|
76
|
+
end
|
73
77
|
end
|
74
78
|
end
|
@@ -11,6 +11,7 @@ module PEBuild
|
|
11
11
|
class PEBootstrap < Vagrant.plugin('2', :provisioner)
|
12
12
|
|
13
13
|
require 'pe_build/provisioner/pe_bootstrap/answers_file'
|
14
|
+
require 'pe_build/provisioner/pe_bootstrap/post_install'
|
14
15
|
|
15
16
|
# @!attribute [r] work_dir
|
16
17
|
# @return [String] The path to the machine pe_build working directory
|
@@ -53,8 +54,9 @@ module PEBuild
|
|
53
54
|
|
54
55
|
[:base, @config.role].each { |rolename| process_step rolename, :pre }
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
@machine.guest.capability('run_install', @config, @archive)
|
58
|
+
|
59
|
+
run_postinstall_tasks
|
58
60
|
|
59
61
|
[:base, @config.role].each { |rolename| process_step rolename, :post }
|
60
62
|
end
|
@@ -100,6 +102,9 @@ module PEBuild
|
|
100
102
|
@archive.unpack_to(@work_dir)
|
101
103
|
end
|
102
104
|
|
105
|
+
require 'pe_build/on_machine'
|
106
|
+
include PEBuild::OnMachine
|
107
|
+
|
103
108
|
def process_step(role, stepname)
|
104
109
|
|
105
110
|
if role != :base && config.step[stepname]
|
@@ -125,44 +130,13 @@ module PEBuild
|
|
125
130
|
template = File.read(template_path)
|
126
131
|
contents = ERB.new(template).result(binding)
|
127
132
|
|
128
|
-
|
133
|
+
on_machine(@machine, contents)
|
129
134
|
end
|
130
135
|
end
|
131
136
|
|
132
|
-
def
|
133
|
-
|
134
|
-
|
135
|
-
:name => @machine.name
|
136
|
-
else
|
137
|
-
@machine.guest.capability('run_install', @config, @archive)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
# Modify the PE puppet master config to use alternate /manifests and /modules
|
142
|
-
#
|
143
|
-
# Manifests and modules need to be mounted on the master via shared folders,
|
144
|
-
# but the default /vagrant mount has permissions and ownership that conflicts
|
145
|
-
# with the puppet master process and the pe-puppet user. Those directories
|
146
|
-
# need to be mounted with permissions like 'fmode=644,dmode=755,fmask=022,dmask=022'
|
147
|
-
#
|
148
|
-
def relocate_installation
|
149
|
-
script_path = File.join(PEBuild.template_dir, 'scripts', 'relocate_installation.sh')
|
150
|
-
script = File.read script_path
|
151
|
-
on_remote script
|
152
|
-
end
|
153
|
-
|
154
|
-
def on_remote(cmd)
|
155
|
-
@machine.communicate.sudo(cmd) do |type, data|
|
156
|
-
if type == :stdout
|
157
|
-
if @config.verbose
|
158
|
-
@machine.ui.info(data.chomp, :color => :green, :prefix => true)
|
159
|
-
else
|
160
|
-
@machine.ui.info('.', :color => :green)
|
161
|
-
end
|
162
|
-
else
|
163
|
-
@machine.ui.info(data.chomp, :color => :red, :prefix => true)
|
164
|
-
end
|
165
|
-
end
|
137
|
+
def run_postinstall_tasks
|
138
|
+
postinstall = PostInstall.new(@machine, @config, @work_dir)
|
139
|
+
postinstall.run
|
166
140
|
end
|
167
141
|
end
|
168
142
|
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'pe_build/on_machine'
|
2
|
+
|
3
|
+
class PEBuild::Provisioner::PEBootstrap::PostInstall
|
4
|
+
|
5
|
+
def initialize(machine, config, work_dir)
|
6
|
+
@machine, @config = machine, config
|
7
|
+
|
8
|
+
@post_install_dir = Pathname.new(File.join(work_dir, 'post-install'))
|
9
|
+
@post_install_manifest = @post_install_dir.join("#{@machine.name}.pp")
|
10
|
+
end
|
11
|
+
|
12
|
+
include PEBuild::OnMachine
|
13
|
+
|
14
|
+
def run
|
15
|
+
if needs_post_install?
|
16
|
+
@machine.ui.info I18n.t('pebuild.provisioner.pe_bootstrap.post_install')
|
17
|
+
|
18
|
+
resources = []
|
19
|
+
|
20
|
+
resources << gen_relocate if @config.relocate_manifests
|
21
|
+
resources << gen_autosign if @config.autosign
|
22
|
+
resources << gen_service
|
23
|
+
|
24
|
+
manifest = resources.join("\n\n")
|
25
|
+
write_manifest(manifest)
|
26
|
+
|
27
|
+
puppet_apply = "/opt/puppet/bin/puppet apply"
|
28
|
+
manifest_path = "/vagrant/.pe_build/post-install/#{@machine.name}.pp"
|
29
|
+
|
30
|
+
on_machine(@machine, "#{puppet_apply} #{manifest_path}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def write_manifest(manifest)
|
37
|
+
@post_install_dir.mkpath unless @post_install_dir.exist?
|
38
|
+
@post_install_manifest.open('w') { |fh| fh.write(manifest) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def needs_post_install?
|
42
|
+
!!(@config.relocate_manifests or @config.autosign)
|
43
|
+
end
|
44
|
+
|
45
|
+
def gen_relocate
|
46
|
+
manifest = <<-MANIFEST.gsub(/^\s{6}/, '')
|
47
|
+
augeas { 'move_manifestdir':
|
48
|
+
changes => 'set etc/puppetlabs/puppet/puppet.conf/main/manifestdir /manifests',
|
49
|
+
notify => Service['pe-httpd'],
|
50
|
+
}
|
51
|
+
|
52
|
+
# Update puppet.conf to add the modulepath directive to point to the
|
53
|
+
# /module mount, if it hasn't already been set.
|
54
|
+
augeas { 'move_modulepath':
|
55
|
+
changes => 'set etc/puppetlabs/puppet/puppet.conf/main/modulepath /modules',
|
56
|
+
notify => Service['pe-httpd'],
|
57
|
+
}
|
58
|
+
|
59
|
+
# Rewrite the olde site.pp config since it's not used, and warn people
|
60
|
+
# about this.
|
61
|
+
file { 'old_site.pp':
|
62
|
+
ensure => file,
|
63
|
+
path => '/etc/puppetlabs/puppet/manifests/site.pp',
|
64
|
+
content => '# /etc/puppetlabs/puppet/manifests is not used; see /manifests.',
|
65
|
+
notify => Service['pe-httpd'],
|
66
|
+
}
|
67
|
+
MANIFEST
|
68
|
+
|
69
|
+
manifest
|
70
|
+
end
|
71
|
+
|
72
|
+
def gen_autosign
|
73
|
+
|
74
|
+
autosign_entries = ['pe-internal-dashboard', @machine.name ]
|
75
|
+
|
76
|
+
case @config.autosign
|
77
|
+
when TrueClass
|
78
|
+
autosign_entries << '*'
|
79
|
+
when Array
|
80
|
+
autosign_entries += @config.autosign
|
81
|
+
end
|
82
|
+
|
83
|
+
autosign_content = autosign_entries.map { |line| "#{line}\n" }.join
|
84
|
+
|
85
|
+
manifest = <<-MANIFEST.gsub(/^\s{6}/, '')
|
86
|
+
file { '/etc/puppetlabs/puppet/autosign.conf':
|
87
|
+
ensure => file,
|
88
|
+
content => "#{autosign_content}",
|
89
|
+
owner => 'root',
|
90
|
+
group => 'pe-puppet',
|
91
|
+
mode => '0644',
|
92
|
+
notify => Service['pe-httpd'],
|
93
|
+
}
|
94
|
+
MANIFEST
|
95
|
+
|
96
|
+
manifest
|
97
|
+
end
|
98
|
+
|
99
|
+
def gen_service
|
100
|
+
manifest = <<-MANIFEST.gsub(/^\s{6}/, '')
|
101
|
+
service { 'pe-httpd':
|
102
|
+
ensure => running,
|
103
|
+
}
|
104
|
+
MANIFEST
|
105
|
+
|
106
|
+
manifest
|
107
|
+
end
|
108
|
+
end
|
data/lib/pe_build/transfer.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
module PEBuild
|
2
2
|
module Transfer
|
3
|
+
|
4
|
+
class UnhandledURIScheme < Vagrant::Errors::VagrantError
|
5
|
+
error_key('unhandled_uri_scheme', 'pebuild.transfer')
|
6
|
+
end
|
7
|
+
|
3
8
|
require 'pe_build/transfer/open_uri'
|
4
9
|
require 'pe_build/transfer/file'
|
5
10
|
|
@@ -17,7 +22,8 @@ module PEBuild
|
|
17
22
|
if (klass = IMPLEMENTATIONS[scheme])
|
18
23
|
klass.new(src, dst)
|
19
24
|
else
|
20
|
-
raise
|
25
|
+
raise UnhandledURIScheme, :scheme => scheme,
|
26
|
+
:supported => IMPLEMENTATIONS.keys
|
21
27
|
end
|
22
28
|
end
|
23
29
|
end
|
data/lib/pe_build/version.rb
CHANGED
data/templates/locales/en.yml
CHANGED
@@ -13,8 +13,41 @@ en:
|
|
13
13
|
Puppet Enterprise is already installed, skipping installation.
|
14
14
|
scheduling_run: |-
|
15
15
|
Scheduling Puppet run to kickstart node classification.
|
16
|
+
post_install: |-
|
17
|
+
Applying post-install configuration to Puppet Enterprise.
|
16
18
|
transfer:
|
17
19
|
open_uri:
|
18
20
|
download_failed: |-
|
19
21
|
An error occurred while trying to download the given resource (%{uri}),
|
20
22
|
and the transfer could not complete. The error message generated was "%{msg}".
|
23
|
+
unhandled_uri_scheme: |-
|
24
|
+
The URI scheme "%{scheme}" cannot be handled by any file transferrers.
|
25
|
+
Supported URI schemes: %{supported}
|
26
|
+
config:
|
27
|
+
global:
|
28
|
+
errors:
|
29
|
+
malformed_version: |-
|
30
|
+
The Puppet Enterprise version "%{version}":%{version_class} is malformed; it must be a String of
|
31
|
+
the format "x.y.z"
|
32
|
+
unhandled_download_root_scheme: |-
|
33
|
+
The URI scheme "%{scheme}" for the download_root "%{download_root}"
|
34
|
+
cannot be handled by any file transferrers.
|
35
|
+
Supported URI schemes: %{supported}
|
36
|
+
invalid_download_root_uri: |-
|
37
|
+
The download_root config option must be either unset or a valid URI.
|
38
|
+
pe_bootstrap:
|
39
|
+
steps_deprecated: |-
|
40
|
+
Explicit :pre, :provision, and :post steps are deprecated and will be removed soon.
|
41
|
+
This functionality can be replaced by directly invoking the `shell` provisioner. More
|
42
|
+
information on the shell provisioner can be found on the Vagrant website at
|
43
|
+
http://docs.vagrantup.com/v2/provisioning/shell.html
|
44
|
+
errors:
|
45
|
+
unset_version: |-
|
46
|
+
The Puppet Enterprise version must be set either on the global pe_build config
|
47
|
+
object or specified on a per-provisioner basis, but both were unset.
|
48
|
+
unknown_role: |-
|
49
|
+
The specified role %{role} is unhandled, must be one of %{known_roles}.
|
50
|
+
invalid_autosign_role: |-
|
51
|
+
Autosign can only be specified if the pe_bootstrap role is 'master', not %{role}.
|
52
|
+
invalid_autosign_class: |-
|
53
|
+
Autosign must be one of %{autosign_classes}, but was of type %{autosign}.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-pe_build
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: progressbar
|
@@ -49,6 +49,7 @@ executables: []
|
|
49
49
|
extensions: []
|
50
50
|
extra_rdoc_files: []
|
51
51
|
files:
|
52
|
+
- .gitignore
|
52
53
|
- CHANGELOG
|
53
54
|
- Gemfile
|
54
55
|
- LICENSE
|
@@ -76,14 +77,19 @@ files:
|
|
76
77
|
- lib/pe_build/command/copy.rb
|
77
78
|
- lib/pe_build/command/download.rb
|
78
79
|
- lib/pe_build/command/list.rb
|
80
|
+
- lib/pe_build/config.rb
|
79
81
|
- lib/pe_build/config/global.rb
|
80
82
|
- lib/pe_build/config/pe_bootstrap.rb
|
83
|
+
- lib/pe_build/config_builder.rb
|
84
|
+
- lib/pe_build/config_builder/global.rb
|
85
|
+
- lib/pe_build/config_builder/pe_bootstrap.rb
|
81
86
|
- lib/pe_build/config_default.rb
|
82
87
|
- lib/pe_build/idempotent.rb
|
83
88
|
- lib/pe_build/on_machine.rb
|
84
89
|
- lib/pe_build/plugin.rb
|
85
90
|
- lib/pe_build/provisioner/pe_bootstrap.rb
|
86
91
|
- lib/pe_build/provisioner/pe_bootstrap/answers_file.rb
|
92
|
+
- lib/pe_build/provisioner/pe_bootstrap/post_install.rb
|
87
93
|
- lib/pe_build/release.rb
|
88
94
|
- lib/pe_build/release/2_0.rb
|
89
95
|
- lib/pe_build/release/2_5.rb
|
@@ -104,7 +110,6 @@ files:
|
|
104
110
|
- templates/answers/master-2.x.txt.erb
|
105
111
|
- templates/answers/master-3.x.txt.erb
|
106
112
|
- templates/locales/en.yml
|
107
|
-
- templates/scripts/relocate_installation.sh
|
108
113
|
- vagrant-pe_build.gemspec
|
109
114
|
homepage: https://github.com/adrienthebo/vagrant-pe_build
|
110
115
|
licenses:
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# Update puppet.conf to add the manifestdir directive to point to the
|
2
|
-
# /manifests mount, if the directive isn't already present.
|
3
|
-
sed -i '
|
4
|
-
2 {
|
5
|
-
/manifest/ !i\
|
6
|
-
manifestdir = /manifests
|
7
|
-
}
|
8
|
-
' /etc/puppetlabs/puppet/puppet.conf
|
9
|
-
|
10
|
-
# Update puppet.conf to add the modulepath directive to point to the
|
11
|
-
# /module mount, if it hasn't already been set.
|
12
|
-
sed -i '
|
13
|
-
/modulepath/ {
|
14
|
-
/vagrant/ !s,$,:/modules,
|
15
|
-
}
|
16
|
-
' /etc/puppetlabs/puppet/puppet.conf
|
17
|
-
|
18
|
-
# Rewrite the olde site.pp config since it's not used, and warn people
|
19
|
-
# about this.
|
20
|
-
echo '# /etc/puppetlabs/puppet/manifests is not used; see /manifests.' > /etc/puppetlabs/puppet/manifests/site.pp
|
21
|
-
|
22
|
-
# Enable autosigning on the master
|
23
|
-
echo '*' > /etc/puppetlabs/puppet/autosign.conf
|