Cheat Sheet速查表
跳转到主要内容

IaC 工具选型与协同架构全景速查表 (Terraform vs Pulumi vs Ansible)

核心架构共识:Terraform、Pulumi 与 Ansible 不是互相替代的竞争对手,而是处于不同系统层次、分工协作的互补工具。

  • Terraform 管 “资源是什么”(Day 0/1 云资源声明与状态管理,专注基础设施拨备 Provisioning);
  • Pulumi 管 “复杂逻辑如何工程化”(用通用编程语言封装高阶平台能力与应用级基础设施);
  • Ansible 管 “机器怎么配”(Day 2 操作系统初始化、软件依赖安装、中间件配置与批量运维自动化)。

三大工具核心定位全景

flowchart TD
    subgraph S1 ["① 基础设施资源拨备 (Provisioning)"]
        TF["<b>Terraform</b><br>声明式 HCL · 跨云 Provider · 强 State 状态图"]
    end

    subgraph S2 ["② 平台工程化封装 (Platform Engineering)"]
        PU["<b>Pulumi</b><br>通用编程语言 (TS/Go/Python) · 模块抽象 · 循环/条件/单元测试"]
    end

    subgraph S3 ["③ 服务器配置与运维 (Configuration Management)"]
        AN["<b>Ansible</b><br>YAML Playbook · 无 Agent (SSH) · 幂等配置 · 批量执行"]
    end

    TF -->|"创建 VPC/计算实例/数据库"| PU
    TF -->|"输出主机 IP / 动态 Inventory"| AN
    PU -->|"封装高阶多租户微服务平台"| AN

    classDef tf fill:#f3f0ff,stroke:#6e40c9,stroke-width:1px,color:#0b0c0c;
    classDef pu fill:#fdf2f8,stroke:#db2777,stroke-width:1px,color:#0b0c0c;
    classDef an fill:#fff7ed,stroke:#ea580c,stroke-width:1px,color:#0b0c0c;
    class TF tf;
    class PU pu;
    class AN an;
维度TerraformPulumiAnsible
核心定位云资源声明与状态编排用通用编程语言工程化管理基础设施服务器系统配置与应用运维自动化
主要解决问题“需要哪些云资源及其拓扑连接”“如何用软件工程方法复用复杂架构”“机器内部如何配置、运行什么服务”
代表语法HCL (HashiCorp Configuration Language)TypeScript, Python, Go, C#, JavaYAML (Playbook 任务清单)
架构模型客户端 CLI + 远程 State + 云厂商 Provider客户端 CLI + 状态后端 (SaaS/S3) + SDK控制节点 (Control Node) + SSH + 目标主机
Agent 依赖无客户端 Agent(直接调用云厂商 REST API)无客户端 Agent(调用云厂商 API / 桥接)无 Agent(Agentless)(基于原生 SSH / WinRM)
生命周期阶段Day 0(规划)/ Day 1(首次资源创建拨备)Day 0 / Day 1(复杂平台架构封装)Day 1(主机环境准备)/ Day 2(长期运维变更)

分工边界:分别更适合做什么?

1. Terraform 更适合的场景

  • 云网络与基础拓扑:VPC、子网、路由表、NAT 网关、对等连接(Peering);
  • 云安全与权限体系:IAM 角色、权限策略(Policy)、用户组、KMS 密钥轮转;
  • 托管云服务与持久层:云数据库(RDS/Aurora)、对象存储桶(S3/OSS)、负载均衡(ALB/SLB);
  • 容器与底层集群编排:EKS/GKE/ACK 集群创建、节点池扩缩容规范配置。

2. Pulumi 更适合的场景

  • 平台工程团队(Internal Developer Platform):需要封装组织内最佳实践标准,供业务研发一键调用;
  • 复杂动态逻辑:需要根据环境变量、动态列表进行 for 循环生成、复杂的跨资源数学计算或条件分支;
  • 全栈与 Serverless 紧密结合:将前端静态站点构建、API Gateway 路由与 AWS Lambda 函数源码写在同一工程代码库中;
  • 成熟的工程化测试:利用 Jest、Mocha 或 PyTest 为基础设施资源编写单元测试与合规性集成测试。

3. Ansible 更适合的场景

  • 主机系统基线初始化:操作系统内核参数调优(sysctl)、设置时区、配置 SSH 登录策略、创建运维用户;
  • 软件安装与补丁管理:批量 apt/yum 更新、安装特定版本 Docker、安全漏洞修复补丁推送;
  • 中间件配置与调优:自动化下发 Nginx 虚拟主机配置、Redis 集群配置文件、配置 systemd 守护进程与日志轮转;
  • 日常批量运维与部署:零停机平滑滚动更新应用服务、应急批量排错、数据库备份脚本巡检执行。

关键核心能力全维度对比矩阵

对比维度TerraformPulumiAnsible
管理核心对象云资源实体(网络、安全、存储、数据库、K8s)云资源 + 平台高阶能力 + 动态逻辑主机操作系统、中间件配置文件、应用服务
表达方式声明式 DSL(HCL)通用图灵完备编程语言(TS/Python/Go/C#)声明式任务流(YAML Playbook)
状态管理强状态管理:依赖 tfstate 图谱,支持 S3/Consul/云端后端与分布式并发锁强状态管理:内置状态机,支持 Pulumi Cloud SaaS 或自建对象存储后端弱状态依赖:无全局状态文件,依赖模块内部的**幂等性(Idempotency)**检测
跨云能力极致成熟:官方/社区拥有数千个高质量 Provider良好成熟:通过原生 Provider 及 Terraform Provider 桥接支持所有主流云与具体云无关:专注在机器内部执行任务(虽然有云模块,但非其主要强项)
复杂逻辑表达表现力有限(支持基础 count/for_each,但缺乏原生循环与复杂分支)极强:具备面向对象、函数封装、模块继承、第三方库导入与异步支持表现力一般:支持简单的 when、loop,适合线性流程执行
主机配置能力较弱(仅提供基础 provisioner,官方建议尽量避免复杂内嵌执行)较弱(通常专注云资源生命周期而非内部配置)极强:开箱提供系统服务、网络、文件管理等海量内置模块
学习门槛中等(需学习 HCL 语法与资源依赖图概念)中偏高(需具备扎实的面向对象/类型系统开发功底)较低(YAML 直观明了,无需编译,上手门槛极低)

成熟的企业级基础设施团队绝非“三选一”,而是将三者串联为标准化流水线:

sequenceDiagram
    autonumber
    actor DevOps as 运维/SRE工程师
    participant TF as Terraform (资源拨备)
    participant Cloud as 云厂商 (AWS/Aliyun)
    participant Inventory as 动态清单 (Dynamic Inventory)
    participant ANS as Ansible (主机配置)
    participant Server as 目标虚拟主机/容器

    DevOps->>TF: 执行 terraform apply
    TF->>Cloud: 调用 API 创建 VPC、安全组、EC2 实例
    Cloud-->>TF: 返回实例元数据 (Public/Private IP)
    TF->>Inventory: 输出结构化 IP 列表或写入 tfstate
    DevOps->>ANS: 执行 ansible-playbook site.yml
    ANS->>Inventory: 动态拉取目标主机清单
    ANS->>Server: 基于 SSH 建立安全连接并探测系统状态
    ANS->>Server: 幂等安装 Docker、配置 Nginx、加固系统安全
    Server-->>ANS: 确认执行变更 (Changed / OK)
    ANS-->>DevOps: 交付就绪的生产主机集群

生产协同三步法

  1. 资源底座拨备 (Terraform):
    • 编写 HCL 声明 VPC、子网、安全组与 EC2 实例集群;
    • 在 outputs.tf 中导出主机的 IP 地址与标签:
      output "web_server_ips" {
        description = "Web 服务器公网 IP 清单"
        value       = aws_instance.web[*].public_ip
      }
  2. 清单桥接 (Dynamic Inventory):
    • Ansible 通过 Terraform 状态插件或云厂商动态清单插件(如 aws_ec2.yml)自动发现机器:
      # /etc/ansible/hosts 或本地 inventory
      [webservers]
      54.213.12.10 ansible_user=ubuntu
      54.213.12.11 ansible_user=ubuntu
  3. 主机幂等配置 (Ansible):
    • 运行 Playbook,自动化完成软件栈初始化:
      - name: 配置 Web 生产服务器
        hosts: webservers
        become: true
        tasks:
          - name: 安装最新版 Docker
            apt:
              name: docker.io
              state: present
              update_cache: true
      
          - name: 启动并启用 Docker 守护进程
            systemd:
              name: docker
              state: started
              enabled: true

核心选型决策树

flowchart TD
    Start{核心目标是什么?} --> Q1{管理的是什么对象?}

    Q1 -->|云网络/存储/数据库/K8s 集群等物理拓扑| Q2{团队技能栈倾向?}
    Q1 -->|操作系统内部配置/软件安装/日常补丁维护| Opt_Ansible["<b>选择 Ansible</b><br>(配置管理与运维自动化首选)"]

    Q2 -->|倾向声明式配置/清晰易读/团队非开发背景为主| Opt_TF["<b>选择 Terraform</b><br>(云资源拨备工业级默认标准)"]
    Q2 -->|全员开发背景/需要复杂抽象/类型复用/Serverless| Opt_Pulumi["<b>选择 Pulumi</b><br>(软件工程化 IaC / 平台工程首选)"]

    classDef opt fill:#f8fafc,stroke:#334155,stroke-width:1px,color:#0f172a;
    class Opt_Ansible,Opt_TF,Opt_Pulumi opt;

核心命令与生命周期对照速查

工具初始化环境预演变更 (Dry-run)正式执行变更状态检查销毁资源
Terraformterraform initterraform planterraform applyterraform show / state listterraform destroy
Pulumipulumi new <template>pulumi previewpulumi uppulumi stackpulumi destroy
Ansibleansible-galaxy installansible-playbook -Cansible-playbook site.ymlansible all -m ping编写 teardown playbook

关联速查与拓展阅读