No Infrastructure as Code
Without infrastructure as code, systems cannot be versioned, reviewed, reproduced, or recovered, and knowledge lives in people's heads. Adopt IaC and GitOps incrementally, importing existing resources, until the whole estate is defined in code.
No infrastructure as code describes an organization that runs real infrastructure with no machine-readable, version-controlled definition of it. Servers, networks, databases, and cloud resources exist, but their configuration lives only in running systems, scattered scripts, and people's memories.
This is the umbrella anti-pattern beneath snowflake servers, ClickOps, and configuration drift. Without IaC, all of those failure modes are nearly inevitable.
Why It Happens
IaC requires upfront investment in tooling, conventions, and discipline. Early on, manual provisioning is faster and the infrastructure is small enough to hold in one's head. The team keeps shipping features, and infrastructure automation is perpetually deferred. By the time the cost of not having IaC is obvious, the infrastructure is large and tangled, making adoption feel daunting, so it is deferred again.
Why It Hurts
Without IaC there is no version history, so you cannot see what changed, when, or by whom, and you cannot roll back. Environments cannot be reproduced, crippling disaster recovery and onboarding. Changes are not reviewed, so errors and security gaps go unchecked. Knowledge concentrates dangerously in a few people. Scaling to new regions or environments means re-deriving everything by hand.
Warning Signs
- Infrastructure is provisioned manually or via ad hoc scripts.
- There is no repository describing the infrastructure.
- No one can confidently rebuild an environment from scratch.
- The network and resource topology is undocumented.
Better Alternatives
Adopt infrastructure as code as the system of record: Terraform, Pulumi, CloudFormation, or CDK for cloud resources, and Ansible, Chef, or Puppet for server configuration. Store definitions in version control and apply them through a GitOps workflow with peer review. Combine with immutable infrastructure so deployed systems always match their code.
How to Refactor Out of It
Start small. Pick one environment or service and codify it, importing existing resources where tooling allows. Run the code against reality and reconcile differences until the definition is authoritative. Make a policy that no new infrastructure is created outside of code. Expand coverage service by service, prioritizing production and security-critical resources, until the entire estate is defined in code.