{"id":1027,"date":"2026-06-10T01:47:10","date_gmt":"2026-06-10T01:47:10","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1027"},"modified":"2026-06-10T01:47:11","modified_gmt":"2026-06-10T01:47:11","slug":"terarform-how-to-install-terraform-and-tfenv-on-macos-apple-silicon-intel-complete-step-by-step-guide","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/terarform-how-to-install-terraform-and-tfenv-on-macos-apple-silicon-intel-complete-step-by-step-guide\/","title":{"rendered":"Terarform: How to Install Terraform and tfenv on macOS (Apple Silicon &amp; Intel) \u2013 Complete Step-by-Step Guide"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Terraform is one of the most popular Infrastructure as Code (IaC) tools used to provision and manage cloud infrastructure across AWS, Azure, Google Cloud, Kubernetes, Datadog, GitHub, and many other platforms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In real-world environments, DevOps and Platform Engineers often need to work with multiple Terraform versions because different projects may require different versions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is where <strong>tfenv<\/strong> becomes extremely useful.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What is Terraform?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Terraform is an open-source Infrastructure as Code (IaC) tool developed by HashiCorp that allows engineers to define infrastructure using code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AWS EC2 Instances<\/li>\n\n\n\n<li>VPCs<\/li>\n\n\n\n<li>RDS Databases<\/li>\n\n\n\n<li>EKS Clusters<\/li>\n\n\n\n<li>Kubernetes Resources<\/li>\n\n\n\n<li>Datadog Monitors<\/li>\n\n\n\n<li>GitHub Repositories<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">can all be managed using Terraform.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What is tfenv?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">tfenv is a Terraform Version Manager similar to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pyenv for Python<\/li>\n\n\n\n<li>nvm for Node.js<\/li>\n\n\n\n<li>rbenv for Ruby<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">tfenv allows you to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install multiple Terraform versions<\/li>\n\n\n\n<li>Switch Terraform versions instantly<\/li>\n\n\n\n<li>Use project-specific Terraform versions<\/li>\n\n\n\n<li>Avoid compatibility issues<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Prerequisites<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before installing Terraform or tfenv, ensure:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Check macOS Version<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sw_vers\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ProductName: macOS\nProductVersion: 15.x\nBuildVersion: xxxx\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Install Xcode Command Line Tools<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>xcode-select --install\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>xcode-select -p\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/Library\/Developer\/CommandLineTools\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 1: Install Homebrew<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew is the package manager for macOS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check if already installed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew --version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If not installed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/bin\/bash -c \"$(curl -fsSL https:\/\/raw.githubusercontent.com\/Homebrew\/install\/HEAD\/install.sh)\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew doctor\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Your system is ready to brew.\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 2: Install tfenv<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Install tfenv using Homebrew.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew install tfenv\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv --version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv 3.2.2\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 3: Let tfenv Control Terraform<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most important step.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do NOT install Terraform directly via Homebrew if you want tfenv to manage versions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If Terraform was previously installed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew unlink terraform\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Link tfenv:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew link --overwrite tfenv\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Refresh shell:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>hash -r\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>which tfenv\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/homebrew\/bin\/tfenv\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify Terraform symlink:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -l \/opt\/homebrew\/bin\/terraform\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/homebrew\/bin\/terraform -&gt; ..\/Cellar\/tfenv\/...\/bin\/terraform\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 4: Install Terraform Versions<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Install Terraform 1.10<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install 1.10.5\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Terraform 1.11<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install 1.11.4\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Terraform 1.12<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install 1.12.2\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Terraform 1.13<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install 1.13.5\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Terraform 1.14<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install 1.14.2\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Terraform 1.15<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install 1.15.5\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 5: View Installed Versions<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv list\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  1.10.5\n  1.11.4\n  1.12.2\n  1.13.5\n  1.14.2\n* 1.15.5\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The asterisk indicates the active version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 6: Switch Terraform Versions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Switch globally:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv use 1.14.2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>terraform version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Terraform v1.14.2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Switch again:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv use 1.15.5\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 7: Use Different Terraform Versions Per Project<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate to your project:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd my-project\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"1.14.2\" &gt; .terraform-version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now whenever you enter the directory:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>terraform version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Terraform automatically switches to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Terraform v1.14.2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is the recommended approach for teams.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 8: Verify Installation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check Terraform location:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>which terraform\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/homebrew\/bin\/terraform\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check active version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>terraform version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check tfenv:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv --version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">List versions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv list\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Common Troubleshooting<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Error: tfenv not found<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Verify installation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew list tfenv\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check PATH:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo $PATH\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Reload shell:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>source ~\/.zshrc\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Error: terraform command not found<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Refresh shell:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>hash -r\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>which terraform\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Error: Could not symlink terraform<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Occurs when Terraform and tfenv both attempt to own:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/homebrew\/bin\/terraform\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew unlink terraform\nbrew link --overwrite tfenv\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Error: tfenv-exec.sh line 31: @: unbound variable<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This usually happens when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Broken symlink<\/li>\n\n\n\n<li>Partial tfenv installation<\/li>\n\n\n\n<li>Terraform linked incorrectly<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew unlink terraform\nbrew link --overwrite tfenv\nhash -r\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Best Practices<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">For Personal Development<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv use latest\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">For Production<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pin exact version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"1.14.2\" &gt; .terraform-version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Commit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git add .terraform-version\ngit commit -m \"Pin Terraform version\"\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">For Teams<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every repository should contain:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.terraform-version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This ensures every engineer uses the same Terraform version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Useful tfenv Commands<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Install version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install 1.15.5\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">List versions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv list\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Switch version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv use 1.15.5\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Show current version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv version-name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Uninstall version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv uninstall 1.12.2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Install latest:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tfenv install latest\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For modern DevOps, Platform Engineering, SRE, and Cloud Infrastructure teams, tfenv is the recommended way to manage Terraform installations on macOS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of maintaining a single Terraform binary, tfenv allows engineers to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install multiple Terraform versions<\/li>\n\n\n\n<li>Switch versions instantly<\/li>\n\n\n\n<li>Use project-specific versions<\/li>\n\n\n\n<li>Avoid compatibility issues<\/li>\n\n\n\n<li>Maintain reproducible infrastructure deployments<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The recommended setup is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew install tfenv\nbrew unlink terraform\nbrew link --overwrite tfenv\ntfenv install 1.15.5\ntfenv use 1.15.5\nterraform version\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You now have a professional Terraform environment capable of supporting multiple projects and Terraform releases on macOS.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Terraform is one of the most popular Infrastructure as Code (IaC) tools used to provision and manage cloud infrastructure across AWS, Azure, Google Cloud, Kubernetes, Datadog,&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1027","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/comments?post=1027"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1027\/revisions"}],"predecessor-version":[{"id":1028,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1027\/revisions\/1028"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}