用错工具比没工具更可怕:Ansible vs Terraform 实战对比,用最接地气的方式讲清楚

举报
Echo_Wish 发表于 2025/11/29 22:42:21 2025/11/29
【摘要】 用错工具比没工具更可怕:Ansible vs Terraform 实战对比,用最接地气的方式讲清楚

用错工具比没工具更可怕: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 负责让世界运转。
你选对工具,你的自动化道路才能越走越顺。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。