用错工具比没工具更可怕:Ansible vs Terraform 实战对比,用最接地气的方式讲清楚
大家好,我是 Echo_Wish,一个长期在运维、云原生、自动化地狱里滚来滚去的实战派。
这几年见过太多团队吵成一锅粥:
“到底该用 Ansible 还是用 Terraform 呀?两者都是自动化啊,为什么要学两个?”
每次碰到这种问题,我都忍不住笑:这俩是兄弟,但性格完全不同,一个能做饭,一个能盖房子。
你让 Terraform 去配系统,就跟让包工头炒菜一样;
你让 Ansible 去维护云资源,就像让厨师去搬砖一样。
所以今天咱就不整那些教科书式的概念,咱用最通俗、最接地气的方式聊聊:
Ansible 和 Terraform,到底谁该干啥 —— 自动化运维的正确打开方式。
我会结合自己的踩坑经验、给你实战级判断思路,还会用代码让你一眼看懂两者的本质区别。
放心,保证你看完之后不再迷糊。
一、先说大白话:Terraform 是“盖房子”,Ansible 是“收拾屋子”
我一直用一个特别形象、但特别准确的比喻:
Terraform:负责把房子建起来。
Ansible:负责把房子收拾到能住。
比如你上云:
- 创建 VPC —— Terraform
- 创建子网、路由表 —— Terraform
- 创建 ECS 虚机 —— Terraform
- 给虚机装 Nginx、改配置、发版本 —— Ansible
- 做系统巡检、批量改参数 —— Ansible
这俩不是互相替代,是互相补位。
Terraform 管资源生命周期(Infrastructure as Code)
Ansible 管系统配置与批量操作(Configuration as Code)
一句话总结:
Terraform:declare what you want(声明我要什么)
Ansible:tell machine what to do(告诉机器你去干啥)
二、从代码看本质差异:为什么说 Terraform 是“声明式”,Ansible 是“命令式”?
先看 Terraform(要什么)
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = "t3.micro"
}
你有没有看到?
- 我没有说怎么创建
- 我只说“我需要一台 t3.micro 的机器”
Terraform 会根据当前状态自动补齐差异(也就是所谓的 plan/apply)。
再看 Ansible(怎么做)
- name: Install Nginx
apt:
name: nginx
state: present
Ansible 是一步一步执行任务,就像流水线。
Terraform:少废话,我需要结果。
Ansible:你告诉我步骤,我照做。
两者根本理念不同,这就是它们为何不能互相替代。
三、什么时候用 Terraform?什么时候用 Ansible?(超实用判断逻辑)
为了让新手不再纠结,我总结了一个非常实用的判断标准:
1)你要创建云资源?用 Terraform。
例如:
- 创建 ECS、RDS、SLB、VPC、S3 bucket
- 构建多 AZ 架构
- 上线新的环境(dev/staging/prod)
Terraform“天生就该干这个”,而且最可怕的是:
它知道“当前资源是什么状态”。
Ansible 不知道。
Ansible 做云 API 就会产生奇怪的重复创建、状态漂移等问题。
2)你要配置服务器?用 Ansible。
例如:
- 批量修改配置
- 部署 Web 服务
- 批量跑脚本
- 配置系统参数(内核参数、limits 等)
- 滚动发布
这都是它的主场。
3)你要又建机器又配软件?两个搭配用
最佳实践:
Terraform:建机器
Ansible:初始化系统 + 部署服务
就像基建和运维分工。
四、实战案例:创建 Web 环境(Terraform + Ansible 的黄金搭档)
下面我写个小案例,将两者完美结合。
第一步:用 Terraform 创建一台虚机
resource "aws_instance" "web" {
ami = "ami-0234abcd"
instance_type = "t2.micro"
tags = {
Name = "web-server"
}
}
terraform apply 后,虚机会自动创建。
第二步:用 Ansible 配置虚机
hosts.ini:
[web]
1.2.3.4 ansible_user=ubuntu
site.yml:
- hosts: web
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Copy config
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
跑:
ansible-playbook site.yml
环境就完整了。
五、常见错误与血泪教训
说点“踩坑后的心得”,都是看别人掉坑、自己也掉坑总结出来的。
❌ 错误 1:用 Ansible 去创建云资源
Ansible 不是不能调云 API,但绝对不推荐。
因为:
- 你重跑一次 playbook,它会重复创建
- 它不知道状态,会出现资源漂移
- 改动不可追踪
- 删除更危险(删多了你都不知道)
别把马拉到厨房炒菜。
❌ 错误 2:用 Terraform 部署应用
Terraform 做这个会让你怀疑人生。比如:
- 配置文件更新 → 要重新 apply
- 每次部署都会 destroy/create
- 改一下服务配置,就出现 plan 漫天飞
最终你的团队会崩溃:
“怎么改个 nginx.conf 还要 terraform apply,全公司恐慌!”
❌ 错误 3:把 Terraform 当脚本工具
Terraform 不是 bash 的替代品。
它是 IaC(基础设施即代码),不是 IaS(Infrastructure as Script)。
要理解“声明式”设计哲学。
六、带图示意:一句话看懂两者定位(Echo_Wish 专属总结图)
下面这个图能帮你彻底理解两者关系👇
(图示内容为文本重述版)
资源层(云资源)
┌──────────────────┐
│ Terraform │
│ - 建虚机 │
│ - 建VPC │
│ - 建数据库 │
└──────────────────┘
↓
系统层(主机配置)
┌──────────────────┐
│ Ansible │
│ - 装软件 │
│ - 改配置 │
│ - 发布应用 │
└──────────────────┘
一句话:
Terraform 造房子
Ansible 装修房子
两者一起,系统才能住人
七、我的个人观点:未来趋势是 Terraform 主资源,Ansible 主配置
基于这几年企业数字化、上云、DevOps 的发展,我的判断是:
- Terraform 将成为 基础设施层的主力
- Ansible 将成为 系统层与运维层主力
- 二者组合将成为 现代自动化的标配
我见过最稳、最高效的团队,都是这么干的。
而不是用一个工具硬抗所有问题。
八、总结一句话送给你:
自动化不是工具之争,而是职责分清。
Terraform 负责建设世界,Ansible 负责让世界运转。
你选对工具,你的自动化道路才能越走越顺。