diff --git a/provisioner/ansible-local/provisioner.go b/provisioner/ansible-local/provisioner.go index 81d86cbd6..861ee8cbc 100644 --- a/provisioner/ansible-local/provisioner.go +++ b/provisioner/ansible-local/provisioner.go @@ -27,6 +27,9 @@ type Config struct { // Path to host_vars directory HostVars string `mapstructure:"host_vars"` + // The playbook dir to upload. + PlaybookDir string `mapstructure:"playbook_dir"` + // The main playbook file to execute. PlaybookFile string `mapstructure:"playbook_file"` @@ -79,6 +82,7 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { "group_vars": &p.config.GroupVars, "host_vars": &p.config.HostVars, "playbook_file": &p.config.PlaybookFile, + "playbook_dir": &p.config.PlaybookDir, "staging_dir": &p.config.StagingDir, "inventory_file": &p.config.InventoryFile, } @@ -123,6 +127,13 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { } } + // Check that the playbook_dir directory exists, if configured + if len(p.config.PlaybookDir) > 0 { + if err := validateDirConfig(p.config.PlaybookDir, "playbook_dir"); err != nil { + errs = packer.MultiErrorAppend(errs, err) + } + } + // Check that the group_vars directory exists, if configured if len(p.config.GroupVars) > 0 { if err := validateDirConfig(p.config.GroupVars, "group_vars"); err != nil { @@ -158,9 +169,16 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { ui.Say("Provisioning with Ansible...") - ui.Message("Creating Ansible staging directory...") - if err := p.createDir(ui, comm, p.config.StagingDir); err != nil { - return fmt.Errorf("Error creating staging directory: %s", err) + if len(p.config.PlaybookDir) > 0 { + ui.Message("Uploading Playbook directory to Ansible staging directory...") + if err := p.uploadDir(ui, comm, p.config.StagingDir, p.config.PlaybookDir); err != nil { + return fmt.Errorf("Error uploading playbook_dir directory: %s", err) + } + } else { + ui.Message("Creating Ansible staging directory...") + if err := p.createDir(ui, comm, p.config.StagingDir); err != nil { + return fmt.Errorf("Error creating staging directory: %s", err) + } } ui.Message("Uploading main Playbook file...") diff --git a/website/source/docs/provisioners/ansible-local.html.markdown b/website/source/docs/provisioners/ansible-local.html.markdown index 40b883280..54601a972 100644 --- a/website/source/docs/provisioners/ansible-local.html.markdown +++ b/website/source/docs/provisioners/ansible-local.html.markdown @@ -68,6 +68,10 @@ Optional: chi-appservers +* `playbook_dir` (string) - a path to the complete ansible directory + structure on your local system to be copied to the remote machine + as the `staging_directory` before all other files and directories. + * `playbook_paths` (array of strings) - An array of paths to playbook files on your local system. These will be uploaded to the remote machine under `staging_directory`/playbooks. By default, this is empty.