github.com/daniellockard/packer@v0.7.6-0.20141210173435-5a9390934716/website/source/docs/provisioners/shell.html.markdown (about) 1 --- 2 layout: "docs" 3 page_title: "Shell Provisioner" 4 description: |- 5 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. 6 --- 7 8 # Shell Provisioner 9 10 Type: `shell` 11 12 The shell Packer provisioner provisions machines built by Packer using shell scripts. 13 Shell provisioning is the easiest way to get software installed and configured 14 on a machine. 15 16 ## Basic Example 17 18 The example below is fully functional. 19 20 ```javascript 21 { 22 "type": "shell", 23 "inline": ["echo foo"] 24 } 25 ``` 26 27 ## Configuration Reference 28 29 The reference of available configuration options is listed below. The only 30 required element is either "inline" or "script". Every other option is optional. 31 32 Exactly _one_ of the following is required: 33 34 * `inline` (array of strings) - This is an array of commands to execute. 35 The commands are concatenated by newlines and turned into a single file, 36 so they are all executed within the same context. This allows you to 37 change directories in one command and use something in the directory in 38 the next and so on. Inline scripts are the easiest way to pull off simple 39 tasks within the machine. 40 41 * `script` (string) - The path to a script to upload and execute in the machine. 42 This path can be absolute or relative. If it is relative, it is relative 43 to the working directory when Packer is executed. 44 45 * `scripts` (array of strings) - An array of scripts to execute. The scripts 46 will be uploaded and executed in the order specified. Each script is executed 47 in isolation, so state such as variables from one script won't carry on to 48 the next. 49 50 Optional parameters: 51 52 * `binary` (boolean) - If true, specifies that the script(s) are binary 53 files, and Packer should therefore not convert Windows line endings to 54 Unix line endings (if there are any). By default this is false. 55 56 * `environment_vars` (array of strings) - An array of key/value pairs 57 to inject prior to the execute_command. The format should be 58 `key=value`. Packer injects some environmental variables by default 59 into the environment, as well, which are covered in the section below. 60 61 * `execute_command` (string) - The command to use to execute the script. 62 By default this is `chmod +x {{ .Path }}; {{ .Vars }} {{ .Path }}`. The value of this is 63 treated as [configuration template](/docs/templates/configuration-templates.html). There are two available variables: `Path`, which is 64 the path to the script to run, and `Vars`, which is the list of 65 `environment_vars`, if configured. 66 67 * `inline_shebang` (string) - The 68 [shebang](http://en.wikipedia.org/wiki/Shebang_%28Unix%29) value to use when 69 running commands specified by `inline`. By default, this is `/bin/sh`. 70 If you're not using `inline`, then this configuration has no effect. 71 72 * `remote_path` (string) - The path where the script will be uploaded to 73 in the machine. This defaults to "/tmp/script.sh". This value must be 74 a writable location and any parent directories must already exist. 75 76 * `start_retry_timeout` (string) - The amount of time to attempt to 77 _start_ the remote process. By default this is "5m" or 5 minutes. This 78 setting exists in order to deal with times when SSH may restart, such as 79 a system reboot. Set this to a higher value if reboots take a longer 80 amount of time. 81 82 ## Execute Command Example 83 84 To many new users, the `execute_command` is puzzling. However, it provides 85 an important function: customization of how the command is executed. The 86 most common use case for this is dealing with **sudo password prompts**. 87 88 For example, if the default user of an installed operating system is "packer" 89 and has the password "packer" for sudo usage, then you'll likely want to 90 change `execute_command` to be: 91 92 ```text 93 "echo 'packer' | {{ .Vars }} sudo -E -S sh '{{ .Path }}'" 94 ``` 95 96 The `-S` flag tells `sudo` to read the password from stdin, which in this 97 case is being piped in with the value of "packer". The `-E` flag tells `sudo` 98 to preserve the environment, allowing our environmental variables to work 99 within the script. 100 101 By setting the `execute_command` to this, your script(s) can run with 102 root privileges without worrying about password prompts. 103 104 ## Default Environmental Variables 105 106 In addition to being able to specify custom environmental variables using 107 the `environment_vars` configuration, the provisioner automatically 108 defines certain commonly useful environmental variables: 109 110 * `PACKER_BUILD_NAME` is set to the name of the build that Packer is running. 111 This is most useful when Packer is making multiple builds and you want to 112 distinguish them slightly from a common provisioning script. 113 114 * `PACKER_BUILDER_TYPE` is the type of the builder that was used to create 115 the machine that the script is running on. This is useful if you want to 116 run only certain parts of the script on systems built with certain builders. 117 118 ## Handling Reboots 119 120 Provisioning sometimes involves restarts, usually when updating the operating 121 system. Packer is able to tolerate restarts via the shell provisioner. 122 123 Packer handles this by retrying to start scripts for a period of time 124 before failing. This allows time for the machine to start up and be ready 125 to run scripts. The amount of time the provisioner will wait is configured 126 using `start_retry_timeout`, which defaults to a few minutes. 127 128 Sometimes, when executing a command like `reboot`, the shell script will 129 return and Packer will start executing the next one before SSH actually 130 quits and the machine restarts. For this, put a long `sleep` after the 131 reboot so that SSH will eventually be killed automatically: 132 133 ```text 134 reboot 135 sleep 60 136 ``` 137 138 Some OS configurations don't properly kill all network connections on 139 reboot, causing the provisioner to hang despite a reboot occuring. 140 In this case, make sure you shut down the network interfaces 141 on reboot or in your shell script. For example, on Gentoo: 142 143 ```text 144 /etc/init.d/net.eth0 stop 145 ``` 146 147 ## Troubleshooting 148 149 *My shell script doesn't work correctly on Ubuntu* 150 151 * On Ubuntu the /bin/sh shell is 152 [dash](http://en.wikipedia.org/wiki/Debian_Almquist_shell). If your script has 153 [bash](http://en.wikipedia.org/wiki/Bash_(Unix_shell\)) specific commands in it 154 then put `#!/bin/bash` at the top of your script. Differences 155 between dash and bash can be found on the [DashAsBinSh](https://wiki.ubuntu.com/DashAsBinSh) Ubuntu wiki page. 156 157 *My shell works when I login but fails with the shell provisioner* 158 159 * See the above tip. More than likely your login shell is using /bin/bash 160 while the provisioner is using /bin/sh. 161 162 *My installs hang when using `apt-get` or `yum`* 163 164 * Make sure you add a "-y" to the command to prevent it from requiring 165 user input before proceeding. 166 167 *How do I tell what my shell script is doing?* 168 169 * Adding a `-x` flag to the shebang at the top of the script (`#!/bin/sh -x`) 170 will echo the script statements as it is executing. 171 172 *My builds don't always work the same* 173 174 * Some distributions start the SSH daemon before other core services which 175 can create race conditions. Your first provisoner can tell the machine to 176 wait until it completely boots. 177 178 ```javascript 179 { 180 "type": "shell", 181 "inline": [ "sleep 10" ] 182 } 183 ```