Infrastructure as code is the practice of defining servers, networks, and services in version-controlled files instead of configuring them by hand. The files become the source of truth: you change the code, review it, and a tool reconciles the running environment to match. The category spans three related jobs - provisioning the infrastructure, configuring what runs on it, and delivering application changes through a pipeline - and most teams use more than one tool because each job has different leaders.
Provisioning, configuration, and delivery
Provisioning creates the raw resources - virtual machines, networks, managed databases. Cloud-native provisioning tools like Azure Resource Manager and Google Cloud Deployment Manager handle this within a single cloud (Terraform does it across clouds). Configuration management then installs and configures software on those resources - Ansible and Chef live here. Continuous delivery builds, tests, and ships application changes - GitLab CI/CD, CircleCI, and Argo CD cover this end.
Declarative and idempotent
The idea that ties the category together is declarative, idempotent configuration. You describe the desired end state - "this network, these five servers, this package installed" - rather than the steps to get there, and the tool figures out what to change. Running it twice against an already-correct system does nothing. That property is what makes infrastructure code safe to re-apply and lets the same definition rebuild an environment from scratch identically.
GitOps and pull-based delivery
GitOps applies the same principle to deployment: a Git repository holds the desired state of a running system, and a controller continuously reconciles the cluster to match. Argo CD is the canonical example for Kubernetes - instead of a pipeline pushing changes into the cluster, an in-cluster agent pulls the declared state from Git and converges to it, with drift detection and one-click rollback to any previous commit.
Choosing tools
- Single cloud, native provisioning? ARM (Azure) or Cloud Deployment Manager (GCP); Terraform for multi-cloud.
- Configuring software on servers? Ansible (agentless, push) or Chef (agent, pull).
- CI/CD pipeline tied to your repo? GitLab CI/CD if you're on GitLab; CircleCI as a hosted, repo-agnostic option.
- Declarative Kubernetes delivery? Argo CD for pull-based GitOps.
The choices that matter are which cloud you're on, whether a tool is push or pull, agent or agentless, and how tightly it integrates with your source control. A typical stack pairs a provisioning tool, a configuration tool, and a delivery pipeline rather than betting on one tool for everything.