diff --git a/provisioner/ansible/provisioner.go b/provisioner/ansible/provisioner.go index 74824483a..9fcf9f835 100644 --- a/provisioner/ansible/provisioner.go +++ b/provisioner/ansible/provisioner.go @@ -39,11 +39,13 @@ type Config struct { ExtraArguments []string `mapstructure:"extra_arguments"` // The main playbook file to execute. - PlaybookFile string `mapstructure:"playbook_file"` - LocalPort string `mapstructure:"local_port"` - SSHHostKeyFile string `mapstructure:"ssh_host_key_file"` - SSHAuthorizedKeyFile string `mapstructure:"ssh_authorized_key_file"` - SFTPCmd string `mapstructure:"sftp_command"` + PlaybookFile string `mapstructure:"playbook_file"` + Groups []string `mapstructure:"groups"` + HostAlias string `mapstructure:"host_alias"` + LocalPort string `mapstructure:"local_port"` + SSHHostKeyFile string `mapstructure:"ssh_host_key_file"` + SSHAuthorizedKeyFile string `mapstructure:"ssh_authorized_key_file"` + SFTPCmd string `mapstructure:"sftp_command"` inventoryFile string } @@ -72,6 +74,10 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { p.config.Command = "ansible-playbook" } + if p.config.HostAlias == "" { + p.config.HostAlias = "default" + } + var errs *packer.MultiError err = validateFileConfig(p.config.PlaybookFile, "playbook_file", true) if err != nil { @@ -196,9 +202,16 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { return fmt.Errorf("Error preparing inventory file: %s", err) } defer os.Remove(tf.Name()) - inv := fmt.Sprintf("default ansible_ssh_host=127.0.0.1 ansible_ssh_user=packer-ansible ansible_ssh_port=%s", p.config.LocalPort) - _, err = tf.Write([]byte(inv)) - if err != nil { + + host := fmt.Sprintf("%s ansible_ssh_host=127.0.0.1 ansible_ssh_user=packer-ansible ansible_ssh_port=%s\n", p.config.HostAlias, p.config.LocalPort) + + w := bufio.NewWriter(tf) + w.WriteString(host) + for _, group := range p.config.Groups { + fmt.Fprintf(w, "[%s]\n%s", group, host) + } + + if err := w.Flush(); err != nil { tf.Close() return fmt.Errorf("Error preparing inventory file: %s", err) } @@ -214,7 +227,6 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { } return nil - } func (p *Provisioner) Cancel() { diff --git a/website/source/docs/provisioners/ansible.html.markdown b/website/source/docs/provisioners/ansible.html.markdown index 5b8127508..d4606bf1f 100644 --- a/website/source/docs/provisioners/ansible.html.markdown +++ b/website/source/docs/provisioners/ansible.html.markdown @@ -47,6 +47,13 @@ Required Parameters: Optional Parameters: +- `groups` (array of strings) - The groups into which the Ansible host + should be placed. When unspecified, the host is not associated with any + groups. + +- `host_alias` (string) - The alias by which the Ansible host should be known. + Defaults to `default`. + - `ssh_host_key_file` (string) - The SSH key that will be used to run the SSH server on the host machine to forward commands to the target machine. Ansible connects to this server and will validate the identity of the server using @@ -71,7 +78,7 @@ Optional Parameters: should read and write on stdin and stdout, respectively. Defaults to `/usr/lib/sftp-server -e`. -- `extra_arguments` (string) - Extra arguments to pass to Ansible. +- `extra_arguments` (array of strings) - Extra arguments to pass to Ansible. ## Limitations