Hashicorp started playing license games. So a bunch of the people and orgs that depend on Terraform took out insurance against future license changes by forking and instituting an open license version that no one can close (or, for that matter, ensure no one pulls a Unity).
"HashiCorp Terraform is an infrastructure as code tool that lets you define both cloud and on-prem resources in human-readable configuration files that you can version, reuse, and share." [1]
Alternatives do exist now and they're all good in their own ways.
They create parameterized "infrastructure as code" definitions that can repeatably create resources.
Terraform is by far the most popular tool for this.
The configuration files themselves are intended to be written in HCL or the Hashicorp Configuration Language, which was created for Terraform and offers some built-in functions and types, but it will also accept json, which is intended more for when you programmatically generate your configuration. They recently began supporting writing your configuration as Python or TypeScript as well, addressing complaints that HCL is close enough to a real programming language that you often wish you had a real programming language.
The state is tracked either in a local file or a remote file, and the file is json. If remote, you can add authorization and locking depending on the remote storage provider.
The meat of the work is not really done by Terraform itself, but by providers, which are plugins either written by Hashicorp, by infrastructure vendors, or by the user community. The configuration files define resources that consist of variables that end up getting passed to these plugins that then construct API calls to request the real infrastructure providers do the provisioning. You also get "data" resources that just query the infrastructure provider rather than asking it to provision anything.
As for why you want Infrastructure as Code, effectively the same reason you want anything as code. Why write software when you can get a computer to do just about anything with shell commands? Because you can reuse, share, make far better reliability and consistency guarantees, and the code itself provides somewhat of an audit trail or record that should reflect the behavior of your resources. As long as your administrators actually use it, you have a clear, readable record of how everything you own was deployed. It can be put to code review before changing anything. You can use your regular peer review/pull request process to implement separation of duties.
Terraform is somewhat of an industry leader. Hashicorp is the company that started out with Vagrant and also makes Packer, Vault, Consul, Nomad, and some other things, but all of their products are pretty widely used and have a lot of developer mindshare. They're not the only game in town, but as far as Infrastructure as Code tools that aren't locked to a single cloud provider, there's really only Terraform and Pulumi that I'm aware of and have seen actually used in the wild.
"infrastructure as code tool that enables you to safely and predictably provision and manage infrastructure in any cloud"
Doesn't tell me anything. Is this a markup language for describing networks? Is it some web interface where you drag and drop server icons and then draw lines between them? Is it a simulation tool? Is it some provisioning thing like chef with a database for different machines?
For those interested, there is a small package that is the core of the specialized graph data structure that powers this: https://github.com/opentofu/opentofu/blob/main/internal/dag/... (link to the most interesting comment block in the package)
Why would I need to encode something like that? Are you talking about maybe having identical setups in different parts of the world?
In development we don't send archives of code to each other (OK, some people do I guess) and in infrastructure we don't click around in AWS to make changes
The click around technique could have logs and audit trails just the same. Someone could also just type up what they did.
If you're doing 100 of something I'm sold but the record argument I find unconvincing. A preference sure, but a simplifier, no.
You don't need 100 instances of something to make managing it programmatically worthwhile. Different environments, for example: Terraform makes it very easy to ensure _all_ of the cloud config in prod matches staging (or the inverse), and to set up and bring down ephemeral development environments, using parameterised Terraform modules so you can be confident changes will propagate appropriately.