Python Terraform
python-terraform is a Python module that provides a wrapper around the Terraform command-line interface (CLI) tool. It allows Python programs to execute Terraform commands (e.g., init, plan, apply, destroy) and capture their output, enabling programmatic interaction with infrastructure as code workflows. The library's latest release, 0.14.0, focuses on compatibility with newer Terraform CLI versions. It follows an irregular release cadence, typically releasing new versions to support significant changes in the Terraform CLI.
Common errors
-
FileNotFoundError: [Errno 2] No such file or directory: 'terraform'
cause The Terraform CLI executable is not installed on the system or is not present in the system's PATH environment variable.fixInstall the Terraform CLI for your operating system and ensure its installation directory is added to your system's PATH. Verify by running `terraform version` in your terminal. -
Terraform Init failed! (or similar errors during plan/apply related to provider plugins)
cause The Terraform working directory specified in `Terraform(working_dir=...)` does not contain valid Terraform configuration files (`.tf`), or `terraform init` was not run successfully, or there's an issue with the Terraform configuration itself (e.g., missing provider definitions, syntax errors).fixEnsure the `working_dir` points to a valid Terraform root module. Always run `tf.init()` first. Debug the underlying Terraform configuration by manually running `terraform init` and `terraform plan` in the specified directory to identify configuration errors. You can also inspect the `stdout` and `stderr` returned by `tf.init()` for detailed error messages. -
Command 'terraform apply' did not return 0. Real-time output not visible.
cause The `terraform apply` command failed, but because `capture_output=True` was not set, the live error messages were not streamed to the console, making debugging difficult. The underlying Terraform command may have failed due to validation errors, provider issues, or unexpected infrastructure state.fixAlways pass `capture_output=True` to Terraform methods if you need to see real-time output for debugging. Inspect the `stdout` and `stderr` variables returned by the method call for the full error details after execution.
Warnings
- breaking Version 0.14.0 of `python-terraform` introduces support for Terraform CLI versions 0.14 and newer. Older versions of `python-terraform` may not be fully compatible with recent Terraform CLI releases, especially concerning changes in output formats or command-line arguments (e.g., changes for Terraform 0.12+).
- gotcha By default, `python-terraform` captures `stdout` and `stderr` from Terraform commands, which can make long-running operations appear to hang until completion. To see real-time output, you must explicitly pass `capture_output` with any non-`None` value (e.g., `True`).
- gotcha Terraform CLI commands like `apply` and `destroy` are interactive by default, requiring user confirmation. Running these commands without suppressing interaction in a script will cause the process to hang.
Install
-
pip install python-terraform
Imports
- Terraform
from python_terraform import Terraform
Quickstart
import os
from python_terraform import Terraform
# Create a dummy Terraform configuration file for demonstration
# In a real scenario, this would be an existing main.tf file.
terraform_dir = "./my_terraform_project"
os.makedirs(terraform_dir, exist_ok=True)
with open(os.path.join(terraform_dir, "main.tf"), "w") as f:
f.write('resource "null_resource" "example" {}')
tf = Terraform(working_dir=terraform_dir)
# Initialize Terraform
return_code, stdout, stderr = tf.init()
print(f"Init Output:\n{stdout}\n{stderr}")
if return_code != 0:
print("Terraform Init failed!")
exit(1)
# Plan the changes
return_code, stdout, stderr = tf.plan(capture_output=True, no_color=True)
print(f"Plan Output:\n{stdout}\n{stderr}")
# Apply the changes (skip_plan=True prevents interactive prompt)
return_code, stdout, stderr = tf.apply(skip_plan=True, capture_output=True, no_color=True)
print(f"Apply Output:\n{stdout}\n{stderr}")
# Destroy the infrastructure
return_code, stdout, stderr = tf.destroy(force=True, capture_output=True, no_color=True)
print(f"Destroy Output:\n{stdout}\n{stderr}")