Back to Packer

HCL templates overview

website/content/docs/templates/hcl_templates/index.mdx

1.15.33.2 KB
Original Source

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

[!IMPORTANT]
Documentation Update: Product documentation previously located in /website has moved to the hashicorp/web-unified-docs repository, where all product documentation is now centralized. Please make contributions directly to web-unified-docs, since changes to /website in this repository will not appear on developer.hashicorp.com. ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

HCL templates overview

This topic provides overview information about HashiCorp configuration language (HCL) templates for Packer.

Introduction

Packer reads and applies configurations defined in HCL template files. HCL templates provide concise descriptions of the required steps to get to a build file. You can add arguments, blocks, and expressions to your HCL templates to define your build as code. Refer to Introduction to Packer HCL2 for additional information.

Builds

The main purpose of the HCL language is defining builds and sources. All other language features exist only to make the definition of builds more flexible and convenient.

packer build takes one argument. When a directory is passed, all files in the folder with a name ending with .pkr.hcl or .pkr.json will be parsed using the HCL2 format. When a file ending with .pkr.hcl or .pkr.json is passed it will be parsed using the HCL2 schema. For every other case; the JSON only old packer schema will be used.

Arguments, blocks, and expressions

The syntax of the HCL language consists of only a few basic elements:

hcl
source "amazon-ebs" "main" {
  ami_name = "main-ami"
}

<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
  # Block body
  <IDENTIFIER> = <EXPRESSION> # Argument
}
  • Blocks are containers for other content and usually represent the configuration of some kind of object, like a source. Blocks have a block type, can have zero or more labels, and have a body that contains any number of arguments and nested blocks. Most of Packer's features are controlled by top-level blocks in a configuration file.
  • Arguments assign a value to a name. They appear within blocks.
  • Expressions represent a value, either literally or by referencing and combining other values. They appear as values for arguments, or within other expressions.

For full details about Packer's syntax, see:

Code organization

The HCL language uses configuration files that are named with the .pkr.hcl file extension. There is also a JSON-based variant of the language that is named with the .pkr.json file extension.

Configuration files must always use UTF-8 encoding, and by convention are usually maintained with Unix-style line endings (LF) rather than Windows-style line endings (CRLF), though both are accepted.

Configuration ordering

The ordering of root blocks is not significant. The order of provisioner or post-processor blocks within a build is the only major feature where block order matters.