From 4c3912bfdce96e71aa2239e2c9ffea99e138b48a Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Mon, 10 Aug 2020 14:07:20 -0700 Subject: [PATCH] add docs note about quoting string variables on the command line --- website/pages/guides/hcl/variables.mdx | 73 ++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/website/pages/guides/hcl/variables.mdx b/website/pages/guides/hcl/variables.mdx index 6f5e2ef0a..51af7ec35 100644 --- a/website/pages/guides/hcl/variables.mdx +++ b/website/pages/guides/hcl/variables.mdx @@ -88,6 +88,79 @@ $ packer build \ Once again, setting variables this way will not save them, and they'll have to be input repeatedly as commands are executed. + +If you plan to assign variables via the command line, we strongly recommend that +you at least set a default type instead of using empty blocks; this helps the +HCL parser understand what is being set. + +For example: + +```hcl +variable "pizza" { + type = string +} + +source "null" "example" { + communicator = "none" +} + +build { + sources = [ + "source.null.example" + ] + provisioner "shell-local" { + inline = ["echo $PIZZA"] + environment_vars = ["PIZZA=${var.pizza}"] + } +} +``` + +If you call the above template using the command + +```sh +packer build -var pizza=pineapple shell_local_variables.pkr.hcl +``` + +then the Packer build will run successfully. However, if you define the variable +using an empty block, the parser will not know what type the variable is, and it +cannot infer the type from the command line, as shown in this example: + +```hcl +variable "pizza" {} + +source "null" "example" { + communicator = "none" +} + +build { + sources = [ + "source.null.example" + ] + provisioner "shell-local" { + inline = ["echo $PIZZA"] + environment_vars = ["PIZZA=${var.pizza}"] + } +} +``` +The above template will result in the error: + +``` +Error: Variables not allowed + + on line 1: + (source code not available) + +Variables may not be used here. +``` + +You can work around this either by quoting the variable on the command line, or +by adding the type to the variable block as shown in the previous example. +Setting the expected type is the more resilient option. + +```sh +packer build -var 'pizza="pineapple"' shell_local_variables.pkr.hcl +``` + #### From a file To persist variable values, create a file and assign variables within