
Image by: Daniil Komov
Terraform and Ansible overview
Did you know that 78% of enterprises using Infrastructure as Code (IaC) tools employ both Terraform and Ansible in their tech stack? These complementary tools have become the dynamic duo of modern infrastructure automation. While they share some similarities, Terraform and Ansible serve fundamentally different purposes in the DevOps workflow.
Terraform, developed by HashiCorp, specializes in infrastructure provisioning across multiple cloud providers. It uses declarative configuration files to create, modify, and version infrastructure components like virtual machines, networks, and storage. Ansible, created by Red Hat, excels at configuration management and application deployment, using procedural automation to configure systems and install software.
The key distinction lies in their approach: Terraform manages the lifecycle of infrastructure resources, while Ansible handles the configuration of existing systems. When combined, they create a complete IaC pipeline from bare metal to fully configured applications.
Core capabilities comparison
| Feature | Terraform | Ansible |
|---|---|---|
| Primary purpose | Infrastructure provisioning | Configuration management |
| Execution model | Declarative | Procedural |
| State management | Centralized state file | Stateless |
| Cloud provider support | 100+ providers | 50+ cloud modules |
| Agent requirement | None | SSH/WinRM only |
State management differences
One of the most significant differences between Terraform and Ansible lies in how they handle state – the representation of your infrastructure’s current condition. Understanding this distinction is crucial for designing reliable automation workflows.
Terraform maintains a state file (terraform.tfstate) that serves as the source of truth for your infrastructure. This JSON file tracks all provisioned resources and their relationships. Before making any changes, Terraform compares your configuration files with this state file to determine what modifications are needed. This approach enables:
- Accurate dependency resolution
- Safe resource modifications
- Detection of configuration drift
Ansible, in contrast, is stateless by design. It doesn’t maintain persistent knowledge about your systems between runs. Each Ansible playbook execution starts fresh, applying configurations based on the current state of target systems. This makes Ansible ideal for:
- Idempotent configuration updates
- Application deployments
- Package management
“Think of Terraform as your architect who designs and builds the house, while Ansible is the interior decorator who makes it livable. They work at different layers with different concerns.” – Kief Morris, Principal Cloud Technologist at ThoughtWorks
When to use each tool
Choosing between Terraform and Ansible – or deciding to use both – depends on your specific infrastructure needs. Here’s a detailed breakdown of when each tool shines.
Terraform best use cases
Use Terraform when you need to:
- Provision cloud infrastructure (VMs, networks, storage)
- Manage multi-cloud environments consistently
- Implement infrastructure changes with minimal risk
- Track infrastructure state and detect drift
- Create disposable environments for testing
Ansible best use cases
Use Ansible when you need to:
- Configure operating systems and middleware
- Deploy applications across multiple servers
- Manage user accounts and security policies
- Perform routine maintenance tasks
- Implement configuration standards
For example, you might use Terraform to provision AWS EC2 instances, then use Ansible to configure those instances with web servers, databases, and monitoring agents. This separation of concerns creates a clean workflow where each tool handles what it does best.
Hybrid workflow orchestration
Combining Terraform and Ansible effectively requires careful orchestration. The most common pattern is provisioning infrastructure with Terraform first, then configuring it with Ansible. Here are three proven approaches to integrate them:
- Terraform local-exec provisioner: Trigger Ansible playbooks directly from Terraform after resource creation
- CI/CD pipeline integration: Chain Terraform and Ansible jobs in tools like Jenkins or GitHub Actions
- Dynamic inventory: Use Terraform outputs to generate Ansible inventory files automatically
The dynamic inventory approach is particularly powerful. Terraform can output the IP addresses or hostnames of provisioned resources, which can then be fed into Ansible’s inventory system. This creates a seamless handoff between provisioning and configuration.
For complex environments, consider using Terraform remote backends to store state securely, while leveraging Ansible’s AWS modules for fine-grained configuration.
Practical integration example
Let’s walk through a concrete example of provisioning a web server with Terraform and configuring it with Ansible. We’ll use AWS as our cloud provider.
Step 1: Terraform provisioning
First, create a Terraform configuration to provision an EC2 instance:
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "web-server"
}
}
output "instance_ip" {
value = aws_instance.web_server.public_ip
}
Step 2: Generate Ansible inventory
After applying the Terraform configuration, create a dynamic inventory script that uses the output:
#!/bin/bash echo "[web_servers]" terraform output -raw instance_ip
Step 3: Ansible configuration
Create an Ansible playbook to install and configure Nginx:
- hosts: web_servers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Start Nginx service
service:
name: nginx
state: started
enabled: yes
Run the playbook using the dynamic inventory:
ansible-playbook -i inventory.sh nginx.yml
This example demonstrates how Terraform and Ansible complement each other to deliver fully automated infrastructure.
Frequently asked questions
Can Ansible replace Terraform completely?
While Ansible has some cloud provisioning capabilities, it’s not designed to replace Terraform. Ansible lacks Terraform’s sophisticated state management and dependency resolution, making it less suitable for complex infrastructure provisioning. The tools are complementary rather than competitive.
How do you handle secrets when combining these tools?
For Terraform, use tools like HashiCorp Vault or AWS Secrets Manager. For Ansible, leverage Ansible Vault or environment variables. Never store secrets in plain text configuration files. Consider using a secrets management solution that both tools can integrate with.
What’s the best way to learn both tools?
Start with the official Terraform tutorials and Ansible documentation. Practice by automating simple projects, then gradually increase complexity. Many learners find it helpful to master one tool before adding the other.
Can you use Terraform and Ansible together in a CI/CD pipeline?
Absolutely! Most teams run Terraform first to provision infrastructure, then run Ansible to configure it. Popular CI/CD tools like Jenkins, GitLab CI, and GitHub Actions can orchestrate this workflow. Make sure to properly sequence the jobs and pass necessary variables between them.
Conclusion
Terraform and Ansible form a powerful combination for modern infrastructure automation. By leveraging Terraform’s provisioning strengths and Ansible’s configuration capabilities, teams can achieve complete Infrastructure as Code workflows. Remember that Terraform excels at creating and managing cloud resources, while Ansible shines at configuring those resources and deploying applications.
The key to successful integration lies in understanding each tool’s purpose and orchestrating their handoff effectively. Whether you’re managing a small project or enterprise-scale infrastructure, combining these tools can significantly improve your automation maturity. Start small with the integration example provided, then expand your automation as you gain confidence.
Ready to take your IaC skills to the next level? Explore our advanced DevOps resources for more in-depth guides and practical examples.
