diff --git a/provisioner/ansible-local/provisioner.go b/provisioner/ansible-local/provisioner.go index a25aca36c..9a5c95daa 100644 --- a/provisioner/ansible-local/provisioner.go +++ b/provisioner/ansible-local/provisioner.go @@ -111,6 +111,8 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { err = validateFileConfig(p.config.PlaybookFile, "playbook_file", true) if err != nil { errs = packer.MultiErrorAppend(errs, err) + } else { + p.playbookFiles = append(p.playbookFiles, p.config.PlaybookFile) } } @@ -197,14 +199,7 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { } } - if p.config.PlaybookFile != "" { - ui.Message("Uploading main Playbook file...") - src := p.config.PlaybookFile - dst := filepath.ToSlash(filepath.Join(p.config.StagingDir, filepath.Base(src))) - if err := p.uploadFile(ui, comm, dst, src); err != nil { - return fmt.Errorf("Error uploading main playbook: %s", err) - } - } else if err := p.provisionPlaybookFiles(ui, comm); err != nil { + if err := p.provisionPlaybookFiles(ui, comm); err != nil { return err } @@ -379,13 +374,6 @@ func (p *Provisioner) executeAnsible(ui packer.Ui, comm packer.Communicator) err } } - if p.config.PlaybookFile != "" { - playbookFile := filepath.ToSlash(filepath.Join(p.config.StagingDir, filepath.Base(p.config.PlaybookFile))) - if err := p.executeAnsiblePlaybook(ui, comm, playbookFile, extraArgs, inventory); err != nil { - return err - } - } - for _, playbookFile := range p.playbookFiles { playbookFile = filepath.ToSlash(filepath.Join(p.config.StagingDir, playbookFile)) if err := p.executeAnsiblePlaybook(ui, comm, playbookFile, extraArgs, inventory); err != nil { diff --git a/provisioner/ansible-local/provisioner_test.go b/provisioner/ansible-local/provisioner_test.go index 1b4bbe5e7..57abc0e87 100644 --- a/provisioner/ansible-local/provisioner_test.go +++ b/provisioner/ansible-local/provisioner_test.go @@ -117,6 +117,58 @@ func TestProvisionerPrepare_PlaybookFiles(t *testing.T) { } } +func TestProvisionerProvision_PlaybookFile(t *testing.T) { + var p Provisioner + config := testConfig() + + playbook := createTempFile("") + defer os.Remove(playbook) + + config["playbook_file"] = playbook + err := p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + comm := &communicatorMock{} + if err := p.Provision(&uiStub{}, comm); err != nil { + t.Fatalf("err: %s", err) + } + + assertPlaybooksUploaded(comm, []string{playbook}) + assertPlaybooksExecuted(comm, []string{playbook}) +} + +func TestProvisionerProvision_PlaybookFileWithPlaybookDir(t *testing.T) { + var p Provisioner + config := testConfig() + + playbook_dir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("Failed to create playbook_dir: %s", err) + } + defer os.RemoveAll(playbook_dir) + playbook := createTempFile(playbook_dir) + + playbookName := filepath.Base(playbook) + playbookInPlaybookDir := strings.TrimPrefix(playbook, playbook_dir) + + config["playbook_file"] = playbook + config["playbook_dir"] = playbook_dir + err = p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + comm := &communicatorMock{} + if err := p.Provision(&uiStub{}, comm); err != nil { + t.Fatalf("err: %s", err) + } + + assertPlaybooksNotUploaded(comm, []string{playbookName}) + assertPlaybooksExecuted(comm, []string{playbookInPlaybookDir}) +} + func TestProvisionerProvision_PlaybookFiles(t *testing.T) { var p Provisioner config := testConfig() @@ -337,7 +389,6 @@ func testProvisionerProvisionDockerWithPlaybookFiles(t *testing.T, templateStrin if err != nil { t.Fatalf("Error preparing download: %s", err) } - defer os.Remove("hello_world") // Add hooks so the provisioners run during the build hooks := map[string][]packer.Hook{} @@ -357,6 +408,7 @@ func testProvisionerProvisionDockerWithPlaybookFiles(t *testing.T, templateStrin t.Fatalf("Error running build %s", err) } defer artifact.Destroy() + defer os.Remove("hello_world") actualContent, err := ioutil.ReadFile("hello_world") if err != nil { @@ -386,7 +438,6 @@ func assertPlaybooksExecuted(comm *communicatorMock, playbooks []string) { } func assertPlaybooksUploaded(comm *communicatorMock, playbooks []string) { - fmt.Println(comm.uploadDestination) uploadIndex := 0 for _, playbook := range playbooks { playbook = filepath.ToSlash(playbook)