Do you need different Terraform versions on different projects? Or maybe you want to test your modules with a new Terraform version?
chtf is a small shell tool for selecting a specified Terraform version. It can also install the specified version automatically.
chtf supports currently bash, zsh, and fish shells. Version switching itself doesn't have any external dependencies.
Optional automatic install of missing Terraform versions requires either:
- Homebrew with tmatilai/terraforms Tap (see below)
- bash, unzip, curl or wget, and sha256sum or shasum; optionally gpg for verifying the signature of the release checksums
On MacOS (and OSX) the easiest way is to use Homebrew. After installing Homebrew, run:
brew trust tmatilai/terraforms
brew install tmatilai/terraforms/chtf
Homebrew also installs the completion for all supported shells.
Manual installation on all systems:
curl -L -o chtf-2.5.0.tar.gz https://github.com/tmatilai/chtf/archive/v2.5.0.tar.gz
tar -xzvf chtf-2.5.0.tar.gz
cd chtf-2.5.0/
make install
The default installation location is $HOME/share/chtf/ for bash/zsh, and $HOME/.config/fish/ for fish. See the Tips section for installing to other locations.
The etc/ directory includes completion files for the supported shells. Follow your shell's instructions how to install them. The fish autocompletion is installed for autoloading.
The following environment variables can be used for configuring chtf. Click to expand.
CHTF_TERRAFORM_DIR - Specifies where the Terraform versions are stored.
Defaults to the Homebrew Caskroom on macOS if the "tmatilai/terraforms" Tap is installed, $HOME/.terraforms/ otherwise.
Each version should be installed as $CHTF_TERRAFORM_DIR/terraform-<version>/terraform.
CHTF_AUTO_INSTALL - Controls automatic installation of missing Terraform versions.
Possible values are: yes, no, and ask.
The default is ask, which will prompt the user for confirmation before automatic installation.
Any other value is treated as ask.
CHTF_AUTO_INSTALL_METHOD - Specifies the method used for automatic installation.
The default is homebrew on macOS if CHTF_TERRAFORM_DIR is not specified and the "tmatilai/terraforms" Tap is installed, zip otherwise.
The homebrew method works only on macOS, as Homebrew Casks are not supported on Linux.
There shouldn't be normally need to set this variable.
CHTF_RELEASES_URL - Base URL for downloading Terraform releases with the zip method.
The default is https://releases.hashicorp.com. Set this to use a mirror.
CHTF_VERIFY_SIGNATURE - Controls verification of the PGP signature of the release checksums with the zip method.
The downloaded Terraform release is always verified against its checksum file. The checksum file itself is additionally verified against HashiCorp's PGP signature when gpg is available.
Possible values are: yes (fail if gpg is not found), no, and auto (the default).
CHTF_GPG_KEY - Path to an ASCII-armored public key for verifying the signature.
Replaces the embedded HashiCorp release signing key, e.g. for a mirror that signs its own checksum files. The signature is then expected in terraform_<version>_SHA256SUMS.sig.
After installing, chtf has to be loaded to the shell.
The fish version is autoloaded so there is nothing more to do!
The base directory on the following examples depends how and where chtf is installed. This assumes make install. With Homebrew, replace $HOME with the output of brew --prefix.
New shell session has to be started for the changes to take effect.
Add the following to the ~/.bashrc or ~/.zshrc:
######################################################################
# chtf
# Uncomment and change the value to override the default:
#CHTF_AUTO_INSTALL="ask" # yes/no/ask
if [[ -f "$HOME/share/chtf/chtf.sh" ]]; then
source "$HOME/share/chtf/chtf.sh"
fiList all installed Terraform versions:
chtf
Select the wanted Terraform version, for example:
chtf 0.13.5
Use the Terraform version installed globally outside chtf (e.g. via a package manager):
chtf system
Customized install
make install installs chtf by default to the user's $HOME directory. But if installed as a root user (e.g. via sudo), the default location is /usr/local for system wide use. In both cases the wanted location can be specified with PREFIX. For example:
sudo make install PREFIX=/opt
The development version of chtf can be used either by sourceing or make installing from a clone of this repository, or with Homebrew:
brew install tmatilai/terraforms/chtf --HEAD
Automatic switching on new shell session
If you want to have a default Terraform version selected when starting a new shell session, you can of course add chtf <version> to the config file after loading chtf.
A bit more flexible way is to write the wanted version number to a file named ~/.terraform-version, and read that.
# bash and zsh
if [[ -f "$HOME/.terraform-version" ]]; then
chtf "$(< "$HOME/.terraform-version")"
fi# fish
if test -f $HOME/.terraform-version
chtf (cat $HOME/.terraform-version)
endUninstalling Terraform versions
Homebrew installed Terraform versions can be uninstalled with:
brew uninstall --cask terraform-<version>
Note that the <version> uses dashes instead of dots for versions installed with chtf v2.2.0 and newer.
Otherwise installed versions can be uninstalled by deleting the directory:
rm -r "$CHTF_TERRAFORM_DIR/terraform-<version>"
Uninstalling chtf
Homebrew installed chtf can be uninstalled with:
brew uninstall chtf
chtf installed with make can be uninstalled by deleting the directory:
rm -r "$HOME/share/chtf" # or where it was installed
Bug reports, pull requests, and other contributions are welcome on GitHub at https://github.com/tmatilai/chtf.
This project is intended to be a safe, welcoming space for collaboration. By participating in this project you agree to abide by the terms of Contributor Code of Conduct.
The project is released as open source under the terms of the MIT License.
Original idea and implementation of chtf was heavily affected by chruby.
NOTE: chtf was originally part of the homebrew-terraforms project, but has been extracted to own project and modified to support also non-Homebrew environments.