Terraform is an open-source “Infrastructure as Code” tool to provision resources in cloud or on-premise workloads like vmware, created by HashiCorp. We can write code with Terraforms language HashiCorp Configuration Language and then with just one command Terraform provisions resources that we declared in our code.
However, we already have so many IaC tools like Ansible, Chef, Puppet and SaltStack. What makes Terraform different from them is the ability to create immutable infrastructures. Immutable infrastructure means that, when there is a change to your Terraform codes, Terraform will be provisioning new resources and then removing the old ones. To illustrate this, assume the following scenario. You created your resources with Terraform, and now you want to install new software to your servers. You could change your Terraform files, and then, Terraform will create new resources with your specified software, after that it will destroy the old resources.
When you put your Terraform codes to your Version Control it even gets better because now, you will always be able to know the current status of your servers. You can even go further by applying your Terraform configuration in your CI/CD pipelines. With this, when you push a change to your Terraform configuration, your infrastructure will be provisioned with the instructions from your Terraform files in your VSC. Using these practices, you will have a version-controlled and automated infrastructure.