Johannes Graf 9998544995 Fix for #6151 / provisioner puppet_server with Puppet Collection 1
puppet_server provisioner fails with Puppet Collection 1 with the
following error:

```bash
==> default: Running provisioner: puppet_server...
The `puppet` binary appears not to be in the PATH of the guest. This
could be because the PATH is not properly setup or perhaps Puppet is not
installed on this guest. Puppet provisioning can not continue without
Puppet properly installed.
```
2015-10-10 21:16:12 +02:00

112 lines
3.7 KiB
Ruby

module VagrantPlugins
module Puppet
module Provisioner
class PuppetServerError < Vagrant::Errors::VagrantError
error_namespace("vagrant.provisioners.puppet_server")
end
class PuppetServer < Vagrant.plugin("2", :provisioner)
def provision
if @machine.config.vm.communicator == :winrm
raise Vagrant::Errors::ProvisionerWinRMUnsupported,
name: "puppet_server"
end
verify_binary("puppet")
run_puppet_agent
end
def verify_binary(binary)
if @config.binary_path
test_cmd = "test -x #{@config.binary_path}/#{binary}"
else
test_cmd = "which #{binary}"
end
@machine.communicate.sudo(
test_cmd,
error_class: PuppetServerError,
error_key: :not_detected,
binary: binary)
end
def run_puppet_agent
options = config.options
options = [options] if !options.is_a?(Array)
# Intelligently set the puppet node cert name based on certain
# external parameters.
cn = nil
if config.puppet_node
# If a node name is given, we use that directly for the certname
cn = config.puppet_node
elsif @machine.config.vm.hostname
# If a host name is given, we explicitly set the certname to
# nil so that the hostname becomes the cert name.
cn = nil
else
# Otherwise, we default to the name of the box.
cn = @machine.config.vm.box
end
# Add the certname option if there is one
options += ["--certname", cn] if cn
# A shortcut to make things easier
comm = @machine.communicate
# If we have client certs specified, then upload them
if config.client_cert_path && config.client_private_key_path
@machine.ui.info(
I18n.t("vagrant.provisioners.puppet_server.uploading_client_cert"))
dirname = "/tmp/puppet-#{Time.now.to_i}-#{rand(1000)}"
comm.sudo("mkdir -p #{dirname}")
comm.sudo("mkdir -p #{dirname}/certs")
comm.sudo("mkdir -p #{dirname}/private_keys")
comm.sudo("chmod -R 0777 #{dirname}")
comm.upload(config.client_cert_path, "#{dirname}/certs/#{cn}.pem")
comm.upload(config.client_private_key_path,
"#{dirname}/private_keys/#{cn}.pem")
# Setup the options so that they point to our directories
options << "--certdir=#{dirname}/certs"
options << "--privatekeydir=#{dirname}/private_keys"
end
# Disable colors if we must
if !@machine.env.ui.color?
options << "--color=false"
end
# Build up the custom facts if we have any
facter = ""
if !config.facter.empty?
facts = []
config.facter.each do |key, value|
facts << "FACTER_#{key}='#{value}'"
end
facter = "#{facts.join(" ")} "
end
puppet_bin = "puppet"
if @config.binary_path
puppet_bin = File.join(@config.binary_path, puppet_bin)
end
options = options.join(" ")
command = "#{facter} #{puppet_bin} agent --onetime --no-daemonize #{options} " +
"--server #{config.puppet_server} --detailed-exitcodes || [ $? -eq 2 ]"
@machine.ui.info I18n.t("vagrant.provisioners.puppet_server.running_puppetd")
@machine.communicate.sudo(command) do |type, data|
if !data.chomp.empty?
@machine.ui.info(data.chomp)
end
end
end
end
end
end
end