diff --git a/provisioner/puppet-masterless/provisioner.go b/provisioner/puppet-masterless/provisioner.go index ceff3edb3..f330d13cf 100644 --- a/provisioner/puppet-masterless/provisioner.go +++ b/provisioner/puppet-masterless/provisioner.go @@ -55,6 +55,10 @@ type Config struct { // Packer requires the directory to exist when running puppet. WorkingDir string `mapstructure:"working_directory"` + // The directory that contains the puppet binary. + // E.g. if it can't be found on the standard path. + PuppetBinDir string `mapstructure:"puppet_bin_dir"` + // If true, packer will ignore all exit-codes from a puppet run IgnoreExitCodes bool `mapstructure:"ignore_exit_codes"` } @@ -70,6 +74,7 @@ type ExecuteTemplate struct { ModulePath string ManifestFile string ManifestDir string + PuppetBinDir string Sudo bool ExtraArguments string } @@ -92,7 +97,8 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { if p.config.ExecuteCommand == "" { p.config.ExecuteCommand = "cd {{.WorkingDir}} && " + "{{.FacterVars}} {{if .Sudo}} sudo -E {{end}}" + - "puppet apply --verbose --modulepath='{{.ModulePath}}' " + + "{{if ne .PuppetBinDir \"\"}}{{.PuppetBinDir}}{{end}}puppet apply " + + "--verbose --modulepath='{{.ModulePath}}' " + "{{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}}" + "{{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}}" + "--detailed-exitcodes " + @@ -227,6 +233,7 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { ManifestDir: remoteManifestDir, ManifestFile: remoteManifestFile, ModulePath: strings.Join(modulePaths, ":"), + PuppetBinDir: p.config.PuppetBinDir, Sudo: !p.config.PreventSudo, WorkingDir: p.config.WorkingDir, ExtraArguments: strings.Join(p.config.ExtraArguments, " "), diff --git a/provisioner/puppet-masterless/provisioner_test.go b/provisioner/puppet-masterless/provisioner_test.go index b2cc3adb9..f7759fb98 100644 --- a/provisioner/puppet-masterless/provisioner_test.go +++ b/provisioner/puppet-masterless/provisioner_test.go @@ -28,6 +28,31 @@ func TestProvisioner_Impl(t *testing.T) { } } +func TestProvisionerPrepare_puppetBinDir(t *testing.T) { + config := testConfig() + + delete(config, "puppet_bin_dir") + p := new(Provisioner) + err := p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + // Test with a good one + tf, err := ioutil.TempFile("", "packer") + if err != nil { + t.Fatalf("error tempfile: %s", err) + } + defer os.Remove(tf.Name()) + + config["puppet_bin_dir"] = tf.Name() + p = new(Provisioner) + err = p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } +} + func TestProvisionerPrepare_hieraConfigPath(t *testing.T) { config := testConfig()