diff --git a/packer/core.go b/packer/core.go index 507c79b81..c9672eb96 100644 --- a/packer/core.go +++ b/packer/core.go @@ -3,6 +3,7 @@ package packer import ( "fmt" "sort" + "strings" ttmp "text/template" @@ -366,9 +367,13 @@ func (c *Core) init() error { c.variables[k] = renderedV ctx.UserVariables = c.variables case ttmp.ExecError: - shouldRetry = true - failedInterpolation = fmt.Sprintf(`"%s": "%s"`, k, v) - continue + castError := err.(ttmp.ExecError) + if strings.Contains(castError.Error(), interpolate.ErrVariableNotSetString) { + shouldRetry = true + failedInterpolation = fmt.Sprintf(`"%s": "%s"; error: %s`, k, v, err) + } else { + return err + } default: return fmt.Errorf( // unexpected interpolation error: abort the run diff --git a/template/interpolate/funcs.go b/template/interpolate/funcs.go index 57495052a..1d76f8f06 100644 --- a/template/interpolate/funcs.go +++ b/template/interpolate/funcs.go @@ -47,6 +47,8 @@ var FuncGens = map[string]FuncGenerator{ "lower": funcGenPrimitive(strings.ToLower), } +var ErrVariableNotSetString = "Error: variable not set:" + // FuncGenerator is a function that given a context generates a template // function for the template. type FuncGenerator func(*Context) interface{} @@ -168,7 +170,7 @@ func funcGenUser(ctx *Context) interface{} { // error and retry if we're interpolating UserVariables. But if // we're elsewhere in the template, just return the empty string. if !ok { - return "", errors.New(fmt.Sprintf("variable %s not set", k)) + return "", fmt.Errorf("%s %s", ErrVariableNotSetString, k) } } return val, nil