Terraform CLI Commands Cheat Sheet
Tags: devops, terraform, infrastructureascode
Published: 2023-07-16 09:07:06

# Introduction
In addition to understanding the basics of Terraform configuration, it's helpful to familiarize yourself with common Terraform CLI commands and shortcuts. This Terraform Cheat Sheet provides a quick reference for commonly used commands and flags.

## Initialize infrastructure
> `terraform init` In order to prepare the working directory for use with Terraform, the terraform init command performs Backend Initialization, Child Module Installation, and Plugin Installation.

|    Command      |   Description   |
| --------------- | --------------- |
| `terraform init`  | Initialize a working directory       |
| `terraform init -input=true`| Ask for input if necessary |  
| `terraform init -get-plugins=false`| Initialize the working directory, do not download plugins|
| `terraform init -lock=false` | Disable locking of state  |
| `terraform init -verify-plugins=false` | Initialize the working directory, do not verify plugins for Hashicorp signature|

  
## Download and Install Modules
> Note this is usually not required as this is part of the terraform init command.

|    Command      |   Description   |
| --------------- | --------------- |
| `terraform get` | Download and installs modules needed for the configuration |
| `terraform get -update` | Modules already downloaded will be checked for updates and updated|

## Format and validate Terraform Code

|    Command      |   Description   |
| --------------- | --------------- |
| `terraform fmt` | Format your Terraform configuration files using the HCL language standard |
| `terraform fmt --recursive` | Also format files in subdirectories |
| `terraform fmt --check` | Useful in automation CI/CD pipelines, the check flag can be used to ensure the configuration files are formatted correctly, if not the exit status will be non-zero. If files are formatted correctly, the exit status will be zero |
| `terraform validate` | Validate the configuration files in your directory |


## Provision infrastructure

|    Command      |   Description   |
| --------------- | --------------- |
| `terraform plan`| Plan will generate an execution plan, showing you what actions will be taken without actually performing the planned actions |
| `terraform plan -out=<path>` | Save the plan file to a given path. Can then be passed to the terraform apply command |
| `terraform plan -destroy` | Create a plan to destroy all objects rather than the usual actions |
| `terraform apply` | Create or update infrastructure depending on the configuration files. By default, a plan will be generated first and will need to be approved before it is applied |
| `terraform apply -auto-approve` | Apply changes without having to interactively type ‘yes’ to the plan. Useful in automation CI/CD pipelines |
| `terraform apply <planfilename>` | Provide the file generated using the terraform plan -out command. If provided, Terraform will take the actions in the plan without any confirmation prompts |
| `terraform apply -lock=false` | Do not hold a state lock during the Terraform apply operation. Use with caution if other engineers might run concurrent commands against the same workspace |
| `terraform apply -var="environment=dev"` | Pass in a variable value |
| `terraform apply -var-file="varfile.tfvars"` | Pass in variables contained in a file |
| `terraform apply -target="module.appgw.0"` | Apply changes only to the targeted resource |
| `terraform destroy` | Destroy the infrastructure managed by Terraform |
| `terraform destroy -target="module.appgw.0"` | Destroy only the targeted resource |
| `terraform destroy --auto-approve` | Destroy the infrastructure without having to interactively type ‘yes’ to the plan. Useful in automation CI/CD pipelines|

## Inspect Infrastructure

|    Command      |   Description   |
| --------------- | --------------- |
| `terraform graph` | Creates a resource graph listing all resources in your configuration and their dependencies|
| `terraform output` | List all the outputs for the root module |
| `terraform output -json` | List all the outputs in JSON format |
| `terraform show` | Show the state file in a human-readable format |

## State Manipulation

|    Command      |   Description   |
| --------------- | --------------- |
| `terraform state list` | Lists out all the resources that are tracked in the current state file |
| `terraform state mv` | Move an item in the state, for example, this is useful when you need to tell Terraform that an item has been renamed, e.g. `terraform state mv vm1.oldname vm1.newname` |
| `terraform state pull > state.tfstate` | Get the current state and outputs it to a local file |
| `terraform state push` | Update remote state from the local state file |
| `terraform state rm` | Remove the specified instance from the state file. Useful when a resource has been manually deleted outside of Terraform |
| `terraform state show <resourcename>` | Show the specified resource in the state file |

### Reference
- https://k21academy.com/terraform-iac/terraform-cheat-sheet/
- https://spacelift.io/blog/terraform-commands-cheat-sheet