provisioner/ansible: configurable command / args

allow users to provide a replacement command / extra args to the
ansible-local provisioner.

this is useful, for example, to unbuffer output when using the
docker builder, or to modify ansible behavior, like enabling
verbose mode, injecting variables, or changing paths.
This commit is contained in:
jamie brim 2014-01-22 04:40:06 -08:00 committed by Jamie Brim
parent 1a57e38963
commit ec1adec029
2 changed files with 28 additions and 3 deletions

View File

@ -6,6 +6,7 @@ import (
"github.com/mitchellh/packer/packer"
"os"
"path/filepath"
"strings"
)
const DefaultStagingDir = "/tmp/packer-provisioner-ansible-local"
@ -26,6 +27,12 @@ type Config struct {
// The directory where files will be uploaded. Packer requires write
// permissions in this directory.
StagingDir string `mapstructure:"staging_directory"`
// The command to run ansible
Command string
// Extra options to pass to the ansible command
ExtraArguments []string `mapstructure:"extra_arguments"`
}
type Provisioner struct {
@ -48,14 +55,20 @@ func (p *Provisioner) Prepare(raws ...interface{}) error {
// Accumulate any errors
errs := common.CheckUnusedConfig(md)
// Defaults
if p.config.StagingDir == "" {
p.config.StagingDir = DefaultStagingDir
}
if p.config.Command == "" {
p.config.Command = "ansible-playbook"
}
// Templates
templates := map[string]*string{
"playbook_file": &p.config.PlaybookFile,
"staging_dir": &p.config.StagingDir,
"command": &p.config.Command,
}
for n, ptr := range templates {
@ -68,8 +81,9 @@ func (p *Provisioner) Prepare(raws ...interface{}) error {
}
sliceTemplates := map[string][]string{
"playbook_paths": p.config.PlaybookPaths,
"role_paths": p.config.RolePaths,
"playbook_paths": p.config.PlaybookPaths,
"role_paths": p.config.RolePaths,
"extra_arguments": p.config.ExtraArguments,
}
for n, slice := range sliceTemplates {
@ -161,7 +175,13 @@ func (p *Provisioner) executeAnsible(ui packer.Ui, comm packer.Communicator) err
// The inventory must be set to "127.0.0.1,". The comma is important
// as its the only way to override the ansible inventory when dealing
// with a single host.
command := fmt.Sprintf("ansible-playbook %s -c local -i %s", playbook, `"127.0.0.1,"`)
var command string
if len(p.config.ExtraArguments) > 0 {
command = fmt.Sprintf("%s %s %s -c local -i \"127.0.0.1,\"", p.config.Command,
playbook, strings.Join(p.config.ExtraArguments, " "))
} else {
command = fmt.Sprintf("%s %s -c local -i \"127.0.0.1,\"", p.config.Command, playbook)
}
ui.Message(fmt.Sprintf("Executing Ansible: %s", command))
cmd := &packer.RemoteCmd{

View File

@ -34,6 +34,11 @@ Required:
Optional:
* `command` (string) - The command to invoke ansible. Defaults to "ansible-playbook".
* `extra_arguments` (array of strings) - An array of extra arguments to pass to the
ansible command. By default, this is empty.
* `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.