Manage Multiple Terraform/OpenTofu Versions
Learn how to install and manage multiple versions of Terraform and OpenTofu using the Atmos toolchain manager.
Overview
Atmos includes a built-in toolchain manager that can install and manage multiple versions of Terraform, OpenTofu, and other infrastructure tools. This is useful when:
- Different projects require different Terraform versions
- You need to test compatibility with newer versions
- Your team needs consistent tool versions across machines
Installing Tool Versions
Install a Specific Version
# Install a specific Terraform version
atmos toolchain install terraform@1.9.0
# Install a specific OpenTofu version
atmos toolchain install opentofu@1.8.0
Install the Latest Version
# Install the latest Terraform
atmos toolchain install terraform@latest
# Install the latest OpenTofu
atmos toolchain install opentofu@latest
Using .tool-versions
The .tool-versions file (compatible with asdf) allows you to pin tool versions per project:
terraform 1.9.0
opentofu 1.8.0
When you run atmos terraform plan, Atmos will automatically use the version specified in .tool-versions.
Setting Versions
# Set Terraform version for current project
atmos toolchain set terraform@1.9.0
# This creates or updates .tool-versions
Listing Installed Versions
# List all installed tools
atmos toolchain list
# Search for available Terraform versions
atmos toolchain registry search terraform
Component-Level Versions in Stacks
Different Terraform components can use different versions. This is useful when:
- Legacy components require older Terraform versions
- New components need features from newer versions
- Gradual upgrades without breaking existing infrastructure
Global Tool Dependencies
Define default versions at the root level of your stack:
# Global tool dependencies - applies to all components
dependencies:
tools:
terraform: "1.9.8"
kubectl: "1.28.0"
Component-Type Dependencies
Override for all Terraform components:
terraform:
dependencies:
tools:
terraform: "1.9.8"
tflint: "0.44.1"
Per-Component Override
Specify versions for individual components:
components:
terraform:
vpc:
dependencies:
tools:
terraform: "1.9.8" # Use current version
aws-cli: "2.13.0"
legacy-app:
dependencies:
tools:
terraform: "1.5.0" # Legacy component needs older version
aws-cli: "2.10.0"
How It Works
When you run a component, Atmos automatically:
- Resolves the tool version from the most specific level
- Installs the tool if not already cached
- Executes the command with that version
# Uses terraform 1.9.8 (from vpc component config)
atmos terraform plan vpc -s prod/us-east-1
# Uses terraform 1.5.0 (from legacy-app component config)
atmos terraform plan legacy-app -s prod/us-east-1
For complete documentation on component dependencies, see Configure Dependencies.
Best Practices
- Pin exact versions in CI/CD: Use exact versions (e.g.,
1.9.0) in pipelines for reproducibility - Use constraints in development: Allow minor version flexibility (e.g.,
>=1.9.0, <1.10.0) for local development - Commit .tool-versions: Include
.tool-versionsin version control so the team uses consistent versions - Test upgrades in isolation: Install new versions and test before updating
.tool-versions
See Also
- Configure Dependencies - Component-level tool version configuration
- Toolchain Commands
- Toolchain Configuration