---
page_title: HCL templates overview
description: |-
  HCL templates are configuration files that describe infrastructure and set variables using HashiCorp configuration language (HCL). Learn about HCL templates for Packer.
---

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
> [!IMPORTANT]  
> **Documentation Update:** Product documentation previously located in `/website` has moved to the [`hashicorp/web-unified-docs`](https://github.com/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](/packer/guides/hcl) 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:

- [Configuration Syntax](/packer/docs/templates/hcl_templates/syntax)
- [Expressions](/packer/docs/templates/hcl_templates/expressions)

## 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](/packer/docs/templates/hcl_templates/syntax-json) 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.
