How to manage different terraform versions for each project
A command-line tool to switch between different versions of terraform.
“We are trapped in a savage parallel universe from which we must escape within four hours, or I will face a death sentence at Mr. Spock’s hands”— Captain’s log, stardate unknown.
Unlike Star Trek, we don’t need to jump between different parallel universes to escape death.However, when building a complex infrastructure for multiple projects, we may have to jump between different versions of development tools.
Enter Terraform
Terraform lets you safely and predictably create, change, and improve infrastructure. It is an open source tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.
As infrastructure providers like AWS, Azure, or Google Cloud Compute evolve and add new features, Hashicorp releases incremental versions of terraform to support these features. So, older projects may be on an older version while newer projects might require a newer version of terraform.
So, how do we switch between different versions of terraform?
Brew tap install terraform — tfswitch
The tfswitch
command line tool lets you switch between different versions of terraform. If you do not have a particular version of terraform installed, tfswitch
will download the version you desire. The installation is minimal and easy. Once installed, simply select the version you require from the dropdown and start using terraform.
tfswitch
is available for MacOS and Linux based operating systems. To use brew, you need homebrew installed. Homebrew simplifies the install process and makes updating easy. To install brew : https://brew.sh/
MacOS with brew
brew install warrensbox/tap/tfswitch
Linux
Installation for Linux operation systems.
curl -L https://raw.githubusercontent.com/warrensbox/terraform-switcher/release/install.sh | bash
Install from source
Alternatively, you can install the tfswitch
binary from the source here
How to use:
Use the dropdown menu to select a version
- You can switch between different versions of terraform by typing the command
tfswitch
on your terminal. - Select the version of terraform you require by using the up and down arrow.
- Hit Enter to select the desired version.
The most recently selected versions are presented at the top of the dropdown.
Supply version on command line
- You can also supply the desired version as an argument on the command line.
- For example,
tfswitch 0.10.5
for version 0.10.5 of terraform. - Hit Enter to switch.
See all versions including beta, alpha and release candidates(RC)
- Display all versions including beta, alpha and release candidates(RC).
- For example,
tfswitch -l
ortfswitch --list-all
to see all versions. - Hit Enter to select the desired version.
Use version.tf file
If a .tf
file with the terraform constrain is present in the current directory, it should automatically download or switch to that terraform version. For example, the following should automatically switch terraform to version 0.12.24
:
terraform {
required_version = ">= 0.12.9"
required_providers {
aws = ">= 2.52.0"
kubernetes = ">= 1.11.1"
}
}
Use .tfswitch.toml file (For non-admin — users with limited privilege on their computers)
This is similar to using a .tfswitchrc file, but you can specify a custom binary path for your terraform installation
- Create a custom binary path. Ex:
mkdir /Users/warrenveerasingam/bin
(replace warrenveerasingam with your username) - Add the path to your PATH. Ex:
export PATH=$PATH:/Users/warrenveerasingam/bin
(add this to your bash profile or zsh profile) - Pass -b or — bin parameter with your custom path to install terraform. Ex:
tfswitch -b /Users/warrenveerasingam/bin/terraform 0.10.8
- Optionally, you can create a
.tfswitch.toml
file in your terraform directory. - Your
.tfswitch.toml
file should look like this:
bin = "/Users/warrenveerasingam/bin/terraform"
version = "0.11.3"
Run tfswitch
and it should automatically install the required terraform version in the specified binary path
Use .tfswitchrc file
- Create a
.tfswitchrc
file containing the desired version - For example,
echo "0.10.5" >> .tfswitchrc
for version 0.10.5 of terraform - Run the command
tfswitch
in the same directory as your.tfswitchrc
Automatically switch with bash
Add the following to the end of your ~/.bashrc
file:
cdtfswitch(){
builtin cd "$@";
cdir=$PWD;
if [ -f "$cdir/.tfswitchrc" ]; then
tfswitch
fi
}
alias cd='cdtfswitch'
Automatically switch with zsh
Add the following to the end of your ~/.zshrc
file:
load-tfswitch() {
local tfswitchrc_path=".tfswitchrc" if [ -f "$tfswitchrc_path" ]; then
tfswitch
fi
}
add-zsh-hook chpwd load-tfswitch
load-tfswitch
NOTE: if you see an error like this: command not found: add-zsh-hook
, then you might be on an older version of zsh (see below), or you simply need to load add-zsh-hook
by adding this to your .zshrc
:
autoload -U add-zsh-hook
Older version of zsh
cd(){
builtin cd "$@";
cdir=$PWD;
if [ -f "$cdir/.tfswitchrc" ]; then
tfswitch
fi
}
Jenkins setup
#!/bin/bash
echo "Installing tfswitch locally"
wget https://raw.githubusercontent.com/warrensbox/terraform-switcher/release/install.sh
chmod 755 install.sh
./install.sh -b bin-directory
./bin-directory/tfswitch
Conclusion
tfswitch
lets you install any terraform version on your computer with minimal effort. Rather than installing terraform manually from the source, with tfswitch
, you can simply select any version from the dropdown option or provide the desired version as a parameter.
CAUTION: Be cautious of the terraform version that you are using for each project when you switch directories
If you like this project, give us a star here: https://github.com/warrensbox/terraform-switcher
Resources
https://github.com/hashicorp/terraform/releases
https://github.com/warrensbox/terraform-switcher
Official download page at: https://www.terraform.io/downloads.html
For older versions, you can install it from their release page:
https://releases.hashicorp.com/terraform/
Warren’s Box contains a selection of DevOps tools that are useful for Systems Engineers, DevOps Engineers, and SREs. Most tools are can be easily installed on UNIX based operating systems.