2013-06-12 13:22:44 -04:00
|
|
|
---
|
2017-06-14 21:04:16 -04:00
|
|
|
description: |
|
|
|
|
The shell Packer provisioner provisions machines built by Packer using shell
|
|
|
|
scripts. Shell provisioning is the easiest way to get software installed and
|
|
|
|
configured on a machine.
|
2015-07-22 22:31:00 -04:00
|
|
|
layout: docs
|
2017-06-14 21:04:16 -04:00
|
|
|
page_title: 'Shell - Provisioners'
|
|
|
|
sidebar_current: 'docs-provisioners-shell-remote'
|
2017-03-25 18:13:52 -04:00
|
|
|
---
|
2013-06-12 13:22:44 -04:00
|
|
|
|
|
|
|
# Shell Provisioner
|
|
|
|
|
|
|
|
Type: `shell`
|
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
The shell Packer provisioner provisions machines built by Packer using shell
|
|
|
|
scripts. Shell provisioning is the easiest way to get software installed and
|
|
|
|
configured on a machine.
|
2013-06-12 13:22:44 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
-> **Building Windows images?** You probably want to use the
|
2015-07-22 22:31:00 -04:00
|
|
|
[PowerShell](/docs/provisioners/powershell.html) or [Windows
|
|
|
|
Shell](/docs/provisioners/windows-shell.html) provisioners.
|
2015-06-14 14:27:48 -04:00
|
|
|
|
2013-06-12 13:22:44 -04:00
|
|
|
## Basic Example
|
|
|
|
|
|
|
|
The example below is fully functional.
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
``` json
|
2013-06-12 13:22:44 -04:00
|
|
|
{
|
|
|
|
"type": "shell",
|
|
|
|
"inline": ["echo foo"]
|
|
|
|
}
|
2014-10-20 13:55:16 -04:00
|
|
|
```
|
2013-06-12 13:22:44 -04:00
|
|
|
|
|
|
|
## Configuration Reference
|
|
|
|
|
2013-07-04 15:07:53 -04:00
|
|
|
The reference of available configuration options is listed below. The only
|
2018-10-26 20:02:51 -04:00
|
|
|
required element is either "inline" or "script". Every other option is
|
|
|
|
optional.
|
2013-06-12 13:22:44 -04:00
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
Exactly *one* of the following is required:
|
2013-06-20 16:51:18 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- `inline` (array of strings) - This is an array of commands to execute. The
|
2018-10-26 20:02:51 -04:00
|
|
|
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
|
2015-07-22 23:25:58 -04:00
|
|
|
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.
|
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- `script` (string) - The path to a script to upload and execute in the
|
|
|
|
machine. This path can be absolute or relative. If it is relative, it is
|
2015-07-22 23:25:58 -04:00
|
|
|
relative to the working directory when Packer is executed.
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- `scripts` (array of strings) - An array of scripts to execute. The scripts
|
2015-07-22 23:25:58 -04:00
|
|
|
will be uploaded and 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.
|
2013-06-20 16:51:18 -04:00
|
|
|
|
|
|
|
Optional parameters:
|
2013-06-12 13:22:44 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- `binary` (boolean) - If true, specifies that the script(s) are binary
|
|
|
|
files, and Packer should therefore not convert Windows line endings to Unix
|
|
|
|
line endings (if there are any). By default this is false.
|
2015-07-22 23:25:58 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- `environment_vars` (array of strings) - An array of key/value pairs to
|
2015-07-22 23:25:58 -04:00
|
|
|
inject prior to the execute\_command. The format should be `key=value`.
|
2018-10-26 20:02:51 -04:00
|
|
|
Packer injects some environmental variables by default into the
|
|
|
|
environment, as well, which are covered in the section below.
|
2015-07-22 23:25:58 -04:00
|
|
|
|
2018-08-29 14:03:42 -04:00
|
|
|
- `use_env_var_file` (boolean) - If true, Packer will write your environment
|
|
|
|
variables to a tempfile and source them from that file, rather than
|
2018-10-26 20:02:51 -04:00
|
|
|
declaring them inline in our execute\_command. The default
|
|
|
|
`execute_command` will be
|
|
|
|
`chmod +x {{.Path}}; . {{.EnvVarFile}} && {{.Path}}`. This option is
|
2018-08-29 14:03:42 -04:00
|
|
|
unnecessary for most cases, but if you have extra quoting in your custom
|
2018-10-26 20:02:51 -04:00
|
|
|
`execute_command`, then this may be unnecessary for proper script
|
|
|
|
execution. Default: false.
|
2015-07-22 23:25:58 -04:00
|
|
|
|
2018-08-29 14:03:42 -04:00
|
|
|
- `execute_command` (string) - The command to use to execute the script. By
|
|
|
|
default this is `chmod +x {{ .Path }}; {{ .Vars }} {{ .Path }}`, unless the
|
|
|
|
user has set `"use_env_var_file": true` -- in that case, the default
|
|
|
|
`execute_command` is `chmod +x {{.Path}}; . {{.EnvVarFile}} && {{.Path}}`.
|
2018-10-26 20:02:51 -04:00
|
|
|
The value of this is treated as a [configuration
|
|
|
|
template](/docs/templates/engine.html). There are three available
|
|
|
|
variables:
|
|
|
|
- `Path` is the path to the script to run
|
|
|
|
- `Vars` is the list of `environment_vars`, if configured.
|
|
|
|
- `EnvVarFile` is the path to the file containing env vars, if
|
|
|
|
`use_env_var_file` is true.
|
|
|
|
- `expect_disconnect` (boolean) - Defaults to `false`. Whether to error if
|
|
|
|
the server disconnects us. A disconnect might happen if you restart the ssh
|
2017-09-14 20:49:34 -04:00
|
|
|
server or reboot the host.
|
2016-10-19 21:30:19 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- `inline_shebang` (string) - The
|
2018-10-26 20:02:51 -04:00
|
|
|
[shebang](https://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.
|
2015-07-22 23:25:58 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- `remote_folder` (string) - The folder where the uploaded script will reside
|
|
|
|
on the machine. This defaults to '/tmp'.
|
2016-04-26 19:04:29 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- `remote_file` (string) - The filename the uploaded script will have on the
|
|
|
|
machine. This defaults to 'script\_nnn.sh'.
|
2016-04-26 19:04:29 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- `remote_path` (string) - The full path to the uploaded script will have on
|
|
|
|
the machine. By default this is remote\_folder/remote\_file, if set this
|
|
|
|
option will override both remote\_folder and remote\_file.
|
2015-07-22 23:25:58 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- `skip_clean` (boolean) - If true, specifies that the helper scripts
|
2016-03-30 01:16:10 -04:00
|
|
|
uploaded to the system will not be removed by Packer. This defaults to
|
2016-03-02 14:37:30 -05:00
|
|
|
false (clean scripts from the system).
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- `start_retry_timeout` (string) - The amount of time to attempt to *start*
|
2016-01-22 12:46:00 -05:00
|
|
|
the remote process. By default this is `5m` or 5 minutes. This setting
|
2018-10-26 20:02:51 -04:00
|
|
|
exists in order to deal with times when SSH may restart, such as a system
|
|
|
|
reboot. Set this to a higher value if reboots take a longer amount of time.
|
2013-08-12 18:49:55 -04:00
|
|
|
|
2018-10-24 08:04:08 -04:00
|
|
|
- `pause_after` (string) - Wait the amount of time after provisioning a shell
|
|
|
|
script, this pause be taken if all previous steps were successful.
|
|
|
|
|
2013-06-27 18:23:47 -04:00
|
|
|
## Execute Command Example
|
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
To many new users, the `execute_command` is puzzling. However, it provides an
|
|
|
|
important function: customization of how the command is executed. The most
|
2018-10-26 20:02:51 -04:00
|
|
|
common use case for this is dealing with **sudo password prompts**. You may
|
|
|
|
also need to customize this if you use a non-POSIX shell, such as `tcsh` on
|
|
|
|
FreeBSD.
|
2013-06-27 18:23:47 -04:00
|
|
|
|
2015-06-29 20:06:49 -04:00
|
|
|
### Sudo Example
|
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
Some operating systems default to a non-root user. For example if you login as
|
|
|
|
`ubuntu` and can sudo using the password `packer`, then you'll want to change
|
|
|
|
`execute_command` to be:
|
2013-06-27 18:23:47 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
``` text
|
2016-10-19 10:28:48 -04:00
|
|
|
"echo 'packer' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'"
|
2013-06-27 18:23:47 -04:00
|
|
|
```
|
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
The `-S` flag tells `sudo` to read the password from stdin, which in this case
|
2016-10-19 10:28:48 -04:00
|
|
|
is being piped in with the value of `packer`.
|
2013-06-27 18:23:47 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
The above example won't work if your environment vars contain spaces or single
|
|
|
|
quotes; in these cases try removing the single quotes:
|
2017-09-27 19:02:18 -04:00
|
|
|
|
|
|
|
``` text
|
|
|
|
"echo 'packer' | sudo -S env {{ .Vars }} {{ .Path }}"
|
|
|
|
```
|
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
By setting the `execute_command` to this, your script(s) can run with root
|
|
|
|
privileges without worrying about password prompts.
|
2013-07-14 21:14:36 -04:00
|
|
|
|
2017-06-21 19:11:47 -04:00
|
|
|
### FreeBSD Example
|
2015-06-29 20:06:49 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
FreeBSD's default shell is `tcsh`, which deviates from POSIX semantics. In
|
|
|
|
order for packer to pass environment variables you will need to change the
|
2017-06-21 19:11:47 -04:00
|
|
|
`execute_command` to:
|
2015-06-29 20:06:49 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
``` text
|
2017-06-21 19:11:47 -04:00
|
|
|
chmod +x {{ .Path }}; env {{ .Vars }} {{ .Path }}
|
2017-03-25 18:13:52 -04:00
|
|
|
```
|
2015-06-29 20:06:49 -04:00
|
|
|
|
2017-06-21 19:11:47 -04:00
|
|
|
Note the addition of `env` before `{{ .Vars }}`.
|
|
|
|
|
2013-07-14 21:14:36 -04:00
|
|
|
## Default Environmental Variables
|
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
In addition to being able to specify custom environmental variables using the
|
|
|
|
`environment_vars` configuration, the provisioner automatically defines certain
|
|
|
|
commonly useful environmental variables:
|
2013-07-14 21:14:36 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- `PACKER_BUILD_NAME` is set to the [name of the
|
|
|
|
build](/docs/templates/builders.html#named-builds) that Packer is running.
|
2015-07-22 23:25:58 -04:00
|
|
|
This is most useful when Packer is making multiple builds and you want to
|
|
|
|
distinguish them slightly from a common provisioning script.
|
2013-07-14 21:14:36 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- `PACKER_BUILDER_TYPE` is the type of the builder that was used to create
|
|
|
|
the machine that the script is running on. This is useful if you want to
|
|
|
|
run only certain parts of the script on systems built with certain
|
|
|
|
builders.
|
2013-08-16 13:05:03 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- `PACKER_HTTP_ADDR` If using a builder that provides an http server for file
|
2017-01-17 20:07:36 -05:00
|
|
|
transfer (such as hyperv, parallels, qemu, virtualbox, and vmware), this
|
|
|
|
will be set to the address. You can use this address in your provisioner to
|
|
|
|
download large files over http. This may be useful if you're experiencing
|
|
|
|
slower speeds using the default file provisioner. A file provisioner using
|
|
|
|
the `winrm` communicator may experience these types of difficulties.
|
|
|
|
|
2013-08-16 13:05:03 -04:00
|
|
|
## Handling Reboots
|
|
|
|
|
|
|
|
Provisioning sometimes involves restarts, usually when updating the operating
|
|
|
|
system. Packer is able to tolerate restarts via the shell provisioner.
|
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
Packer handles this by retrying to start scripts for a period of time before
|
|
|
|
failing. This allows time for the machine to start up and be ready to run
|
|
|
|
scripts. The amount of time the provisioner will wait is configured using
|
|
|
|
`start_retry_timeout`, which defaults to a few minutes.
|
2013-08-16 13:05:03 -04:00
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
Sometimes, when executing a command like `reboot`, the shell script will return
|
|
|
|
and Packer will start executing the next one before SSH actually quits and the
|
2018-10-26 20:02:51 -04:00
|
|
|
machine restarts. For this, put use "pause\_before" to make Packer wait before
|
|
|
|
executing the next script:
|
2013-08-16 13:05:03 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
``` json
|
2016-10-04 12:19:26 -04:00
|
|
|
{
|
|
|
|
"type": "shell",
|
|
|
|
"script": "script.sh",
|
|
|
|
"pause_before": "10s"
|
|
|
|
}
|
2013-08-16 13:05:03 -04:00
|
|
|
```
|
2013-08-20 17:07:21 -04:00
|
|
|
|
2015-07-22 22:31:00 -04:00
|
|
|
Some OS configurations don't properly kill all network connections on reboot,
|
|
|
|
causing the provisioner to hang despite a reboot occurring. In this case, make
|
2018-10-26 20:02:51 -04:00
|
|
|
sure you shut down the network interfaces on reboot or in your shell script.
|
|
|
|
For example, on Gentoo:
|
2013-08-28 13:46:45 -04:00
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
``` text
|
2013-08-28 13:46:45 -04:00
|
|
|
/etc/init.d/net.eth0 stop
|
|
|
|
```
|
|
|
|
|
2015-06-13 20:15:49 -04:00
|
|
|
## SSH Agent Forwarding
|
|
|
|
|
|
|
|
Some provisioning requires connecting to remote SSH servers from within the
|
|
|
|
packer instance. The below example is for pulling code from a private git
|
|
|
|
repository utilizing openssh on the client. Make sure you are running
|
2018-10-26 20:02:51 -04:00
|
|
|
`ssh-agent` and add your git repo ssh keys into it using
|
|
|
|
`ssh-add /path/to/key`. When the packer instance needs access to the ssh keys
|
|
|
|
the agent will forward the request back to your `ssh-agent`.
|
2015-07-22 22:31:00 -04:00
|
|
|
|
|
|
|
Note: when provisioning via git you should add the git server keys into the
|
|
|
|
`~/.ssh/known_hosts` file otherwise the git command could hang awaiting input.
|
|
|
|
This can be done by copying the file in via the [file
|
|
|
|
provisioner](/docs/provisioners/file.html) (more secure) or using `ssh-keyscan`
|
|
|
|
to populate the file (less secure). An example of the latter accessing github
|
|
|
|
would be:
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
``` json
|
2016-03-30 01:16:10 -04:00
|
|
|
{
|
|
|
|
"type": "shell",
|
|
|
|
"inline": [
|
|
|
|
"sudo apt-get install -y git",
|
|
|
|
"ssh-keyscan github.com >> ~/.ssh/known_hosts",
|
|
|
|
"git clone git@github.com:exampleorg/myprivaterepo.git"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
```
|
2015-06-13 20:15:49 -04:00
|
|
|
|
2013-08-20 17:07:21 -04:00
|
|
|
## Troubleshooting
|
|
|
|
|
|
|
|
*My shell script doesn't work correctly on Ubuntu*
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- On Ubuntu, the `/bin/sh` shell is
|
2016-01-14 15:31:19 -05:00
|
|
|
[dash](https://en.wikipedia.org/wiki/Debian_Almquist_shell). If your script
|
2017-01-25 19:05:43 -05:00
|
|
|
has [bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell))-specific
|
|
|
|
commands in it, then put `#!/bin/bash -e` at the top of your script.
|
|
|
|
Differences between dash and bash can be found on the
|
2015-07-22 23:25:58 -04:00
|
|
|
[DashAsBinSh](https://wiki.ubuntu.com/DashAsBinSh) Ubuntu wiki page.
|
2013-08-20 17:07:21 -04:00
|
|
|
|
|
|
|
*My shell works when I login but fails with the shell provisioner*
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- See the above tip. More than likely, your login shell is using `/bin/bash`
|
2015-07-22 23:25:58 -04:00
|
|
|
while the provisioner is using `/bin/sh`.
|
2013-08-20 17:07:21 -04:00
|
|
|
|
2013-08-30 01:19:13 -04:00
|
|
|
*My installs hang when using `apt-get` or `yum`*
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- Make sure you add a `-y` to the command to prevent it from requiring user
|
2015-07-22 23:25:58 -04:00
|
|
|
input before proceeding.
|
2013-08-30 01:19:13 -04:00
|
|
|
|
2013-08-20 17:07:21 -04:00
|
|
|
*How do I tell what my shell script is doing?*
|
|
|
|
|
2017-06-14 21:04:16 -04:00
|
|
|
- Adding a `-x` flag to the shebang at the top of the script (`#!/bin/sh -x`)
|
2015-07-22 23:25:58 -04:00
|
|
|
will echo the script statements as it is executing.
|
2013-08-20 19:34:48 -04:00
|
|
|
|
|
|
|
*My builds don't always work the same*
|
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
- Some distributions start the SSH daemon before other core services which
|
|
|
|
can create race conditions. Your first provisioner can tell the machine to
|
|
|
|
wait until it completely boots.
|
2013-08-20 19:34:48 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
``` json
|
2014-10-20 13:55:16 -04:00
|
|
|
{
|
|
|
|
"type": "shell",
|
|
|
|
"inline": [ "sleep 10" ]
|
|
|
|
}
|
|
|
|
```
|
2018-08-29 14:03:42 -04:00
|
|
|
|
|
|
|
## Quoting Environment Variables
|
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
Packer manages quoting for you, so you should't have to worry about it. Below
|
|
|
|
is an example of packer template inputs and what you should expect to get out:
|
2018-08-29 14:03:42 -04:00
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
``` json
|
2018-08-29 14:03:42 -04:00
|
|
|
"provisioners": [
|
|
|
|
{
|
|
|
|
"type": "shell",
|
|
|
|
"environment_vars": ["FOO=foo",
|
|
|
|
"BAR=bar's",
|
|
|
|
"BAZ=baz=baz",
|
|
|
|
"QUX==qux",
|
|
|
|
"FOOBAR=foo bar",
|
|
|
|
"FOOBARBAZ='foo bar baz'",
|
|
|
|
"QUX2=\"qux\""],
|
|
|
|
"inline": ["echo \"FOO is $FOO\"",
|
|
|
|
"echo \"BAR is $BAR\"",
|
|
|
|
"echo \"BAZ is $BAZ\"",
|
|
|
|
"echo \"QUX is $QUX\"",
|
|
|
|
"echo \"FOOBAR is $FOOBAR\"",
|
|
|
|
"echo \"FOOBARBAZ is $FOOBARBAZ\"",
|
|
|
|
"echo \"QUX2 is $QUX2\""]
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Output:
|
|
|
|
|
2018-10-26 20:02:51 -04:00
|
|
|
docker: FOO is foo
|
|
|
|
docker: BAR is bar's
|
|
|
|
docker: BAZ is baz=baz
|
|
|
|
docker: QUX is =qux
|
|
|
|
docker: FOOBAR is foo bar
|
|
|
|
docker: FOOBARBAZ is 'foo bar baz'
|
|
|
|
docker: QUX2 is "qux"
|