first pass at docs update

This commit is contained in:
Megan Marsh 2018-03-01 10:56:30 -08:00
parent 854d6fb141
commit 5da4377f21
4 changed files with 83 additions and 10 deletions

View File

@ -3,6 +3,7 @@ package shell_local
import ( import (
"fmt" "fmt"
"io" "io"
"log"
"os" "os"
"os/exec" "os/exec"
"syscall" "syscall"
@ -20,6 +21,7 @@ func (c *Communicator) Start(cmd *packer.RemoteCmd) error {
} }
// Build the local command to execute // Build the local command to execute
log.Printf("Executing local shell command %s", c.ExecuteCommand)
localCmd := exec.Command(c.ExecuteCommand[0], c.ExecuteCommand[1:]...) localCmd := exec.Command(c.ExecuteCommand[0], c.ExecuteCommand[1:]...)
localCmd.Stdin = cmd.Stdin localCmd.Stdin = cmd.Stdin
localCmd.Stdout = cmd.Stdout localCmd.Stdout = cmd.Stdout

View File

@ -30,7 +30,11 @@ func (p *PostProcessor) Configure(raws ...interface{}) error {
} else if len(p.config.ExecuteCommand) == 1 { } else if len(p.config.ExecuteCommand) == 1 {
// Backwards compatibility -- before merge, post-processor didn't have // Backwards compatibility -- before merge, post-processor didn't have
// configurable call to shell program, meaning users may not have // configurable call to shell program, meaning users may not have
// defined this in their call // defined this in their call. If users are still using the old way of
// defining ExecuteCommand (e.g. just supplying a single string that is
// now being interpolated as a slice with one item), then assume we need
// to prepend this call still, and use the one that the post-processor
// defaulted to before.
p.config.ExecuteCommand = append([]string{"sh", "-c"}, p.config.ExecuteCommand...) p.config.ExecuteCommand = append([]string{"sh", "-c"}, p.config.ExecuteCommand...)
} }

View File

@ -13,7 +13,7 @@ Type: `shell-local`
The local shell post processor executes scripts locally during the post The local shell post processor executes scripts locally during the post
processing stage. Shell local provides a convenient way to automate executing processing stage. Shell local provides a convenient way to automate executing
some task with the packer outputs. some task with packer outputs and variables.
## Basic example ## Basic example
@ -33,6 +33,9 @@ required element is either "inline" or "script". Every other option is optional.
Exactly *one* of the following is required: Exactly *one* of the following is required:
- `command` (string) - This is a single command to execute. It will be written
to a temporary file and run using the `execute_command` call below.
- `inline` (array of strings) - This is an array of commands to execute. The - `inline` (array of strings) - This is an array of commands to execute. The
commands are concatenated by newlines and turned into a single file, so they commands are concatenated by newlines and turned into a single file, so they
are all executed within the same context. This allows you to change are all executed within the same context. This allows you to change
@ -52,15 +55,32 @@ Exactly *one* of the following is required:
Optional parameters: Optional parameters:
- `environment_vars` (array of strings) - An array of key/value pairs to - `environment_vars` (array of strings) - An array of key/value pairs to
inject prior to the execute\_command. The format should be `key=value`. inject prior to the `execute_command`. The format should be `key=value`.
Packer injects some environmental variables by default into the environment, Packer injects some environmental variables by default into the environment,
as well, which are covered in the section below. as well, which are covered in the section below.
- `execute_command` (string) - The command to use to execute the script. By - `execute_command` (array of strings) - The command used to execute the script. By
default this is `chmod +x "{{.Script}}"; {{.Vars}} "{{.Script}}"`. default this is `["sh", "-c", "chmod +x \"{{.Script}}\"; {{.Vars}} \"{{.Script}}\""]`
The value of this is treated as [template engine](/docs/templates/engine.html). on unix and `["cmd", "/c", "{{.Vars}}", "{{.Script}}"]` on windows.
This is treated as a [template engine](/docs/templates/engine.html).
There are two available variables: `Script`, which is the path to the script There are two available variables: `Script`, which is the path to the script
to run, `Vars`, which is the list of `environment_vars`, if configured. to run, and `Vars`, which is the list of `environment_vars`, if configured.
If you choose to set this option, make sure that the first element in the
array is the shell program you want to use (for example, "sh" or
"/usr/local/bin/zsh" or even "powershell.exe" although anything other than
a flavor of the shell command language is not explicitly supported and may
be broken by assumptions made within Packer).
For backwards compatibility, `execute_command` will accept a string insetad
of an array of strings. If a single string or an array of strings with only
one element is provided, Packer will replicate past behavior by appending
your `execute_command` to the array of strings `["sh", "-c"]`. For example,
if you set `"execute_command": "foo bar"`, the final `execute_command` that
Packer runs will be ["sh", "-c", "foo bar"]. If you set `"execute_command": ["foo", "bar"]`,
the final execute_command will remain `["foo", "bar"]`.
Again, the above is only provided as a backwards compatibility fix; we
strongly recommend that you set execute_command as an array of strings.
- `inline_shebang` (string) - The - `inline_shebang` (string) - The
[shebang](http://en.wikipedia.org/wiki/Shebang_%28Unix%29) value to use when [shebang](http://en.wikipedia.org/wiki/Shebang_%28Unix%29) value to use when

View File

@ -37,10 +37,26 @@ The example below is fully functional.
The reference of available configuration options is listed below. The only The reference of available configuration options is listed below. The only
required element is "command". required element is "command".
Required: Exactly *one* of the following is required:
- `command` (string) - The command to execute. This will be executed within - `command` (string) - This is a single command to execute. It will be written
the context of a shell as specified by `execute_command`. to a temporary file and run using the `execute_command` call below.
- `inline` (array of strings) - This is an array of commands to execute. The
commands are concatenated by newlines and turned into a single file, so they
are all executed within the same context. This allows you to change
directories in one command and use something in the directory in the next
and so on. Inline scripts are the easiest way to pull off simple tasks
within the machine.
- `script` (string) - The path to a script to execute. This path can be
absolute or relative. If it is relative, it is relative to the working
directory when Packer is executed.
- `scripts` (array of strings) - An array of scripts to execute. The scripts
will be executed in the order specified. Each script is executed in
isolation, so state such as variables from one script won't carry on to the
next.
Optional parameters: Optional parameters:
@ -50,3 +66,34 @@ Optional parameters:
treated as [configuration treated as [configuration
template](/docs/templates/engine.html). The only available template](/docs/templates/engine.html). The only available
variable is `Command` which is the command to execute. variable is `Command` which is the command to execute.
- `environment_vars` (array of strings) - An array of key/value pairs to
inject prior to the `execute_command`. The format should be `key=value`.
Packer injects some environmental variables by default into the environment,
as well, which are covered in the section below.
- `execute_command` (array of strings) - The command used to execute the script.
By default this is `["/bin/sh", "-c", "{{.Vars}}, "{{.Script}}"]`
on unix and `["cmd", "/c", "{{.Vars}}", "{{.Script}}"]` on windows.
This is treated as a [template engine](/docs/templates/engine.html).
There are two available variables: `Script`, which is the path to the script
to run, and `Vars`, which is the list of `environment_vars`, if configured
If you choose to set this option, make sure that the first element in the
array is the shell program you want to use (for example, "sh" or
"/usr/local/bin/zsh" or even "powershell.exe" although anything other than
a flavor of the shell command language is not explicitly supported and may
be broken by assumptions made within Packer), and a later element in the
array must be `{{.Script}}`.
For backwards compatability, {{.Command}} is also available to use in
`execute_command` but it is decoded the same way as {{.Script}}. We
recommend using {{.Script}} for the sake of clarity, as even when you set
only a single `command` to run, Packer writes it to a temporary file and
then runs it as a script.
- `inline_shebang` (string) - The
[shebang](http://en.wikipedia.org/wiki/Shebang_%28Unix%29) value to use when
running commands specified by `inline`. By default, this is `/bin/sh -e`. If
you're not using `inline`, then this configuration has no effect.
**Important:** If you customize this, be sure to include something like the
`-e` flag, otherwise individual steps failing won't fail the provisioner.