---
description: |
  This section describes the configuration language used to create Packer
  templates.
page_title: Templates
---

# Packer Templates

Packer's behavior is determined by the Packer template, which consists of a
series of declarations and commands for Packer to follow. This template tells
Packer what plugins (builders, provisioners, post-processors) to use, how to
configure each of those plugins, and what order to run them in.

The template contains flexible variable injection tools, as well as built-in
functions to help you customize your builds.

Historically, Packer has used a JSON template for its configuration, but Packer
is transitioning to a new template configuration format that uses HCL2 -- the
same configuration language used by Terraform and HashiCorp's other products.
This format is more flexible, more modular, and more concise than the original
JSON template format. While the JSON format is still supported, certain
new features in the Packer core will only be implemented for the newer HCL
format. Please use the side bar to find documentation for the different
template formats.

From version **1.7.0**, HCL2 becomes officially the preferred way to write Packer
configuration(s).

If you need help upgrading a JSON template to an HCL template, check
our upgrade guide [here](/packer/tutorials/configuration-language/hcl2-upgrade).
