From be8c9dddf2a93b9f4883786ffe3cf581c73e8c78 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Fri, 17 Jul 2015 22:24:23 +0200 Subject: [PATCH] Puppet masterless provisioner optionally cleans staging directory When puppet is executed in masterless mode it didn't remove staging directory, this can be a problem because it leaves all the modules and manifests in the built image. This is specially problematic when building docker images as they can be left in the layers unless an specific cleanup is done after running puppet. This change adds a flag `clean_staging_directory` to puppet masterless provisioner so it takes care of this cleanup. --- provisioner/puppet-masterless/provisioner.go | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/provisioner/puppet-masterless/provisioner.go b/provisioner/puppet-masterless/provisioner.go index 546224a54..a82837769 100644 --- a/provisioner/puppet-masterless/provisioner.go +++ b/provisioner/puppet-masterless/provisioner.go @@ -45,6 +45,9 @@ type Config struct { // permissions in this directory. StagingDir string `mapstructure:"staging_directory"` + // If true, staging directory is removed after executing puppet. + CleanStagingDir bool `mapstructure:"clean_staging_directory"` + // The directory from which the command will be executed. // Packer requires the directory to exist when running puppet. WorkingDir string `mapstructure:"working_directory"` @@ -237,6 +240,12 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { return fmt.Errorf("Puppet exited with a non-zero exit status: %d", cmd.ExitStatus) } + if p.config.CleanStagingDir { + if err := p.removeDir(ui, comm, p.config.StagingDir); err != nil { + return fmt.Errorf("Error removing staging directory: %s", err) + } + } + return nil } @@ -325,6 +334,22 @@ func (p *Provisioner) createDir(ui packer.Ui, comm packer.Communicator, dir stri return nil } +func (p *Provisioner) removeDir(ui packer.Ui, comm packer.Communicator, dir string) error { + cmd := &packer.RemoteCmd{ + Command: fmt.Sprintf("rm -fr '%s'", dir), + } + + if err := cmd.StartWithUi(comm, ui); err != nil { + return err + } + + if cmd.ExitStatus != 0 { + return fmt.Errorf("Non-zero exit status.") + } + + return nil +} + func (p *Provisioner) uploadDirectory(ui packer.Ui, comm packer.Communicator, dst string, src string) error { if err := p.createDir(ui, comm, dst); err != nil { return err