别让基础设施管了两遍:Terraform 建资源 + Ansible 管配置的协同边界与 5 个生产级决策
概述 凌晨两点,告警群炸了。一台刚上线两小时的 Web 服务器 CPU 飙到 100%,SSH 进去一看,Nginx 没装,但端口被一个旧版本 Apache 占着。翻部署日志发现:Terraform 10 分钟前做了一次 terraform apply,把这台机器重建了(因为有人改了 instance_type),但 Ansible 的配置脚本没有跟着跑——机器是新机器,上面的软件配置全丢了。 这不是个例。用 Terraform 建云主机、用 Ansible 做配置管理,这个组合在 2026 年已经是运维团队的标配。但"标配"不等于"配好了"——大量团队把这两个工具简单堆在一起,没有清晰的协同设计,结果就是基础设施"管了两遍":Terraform 建了一遍资源,Ansible 又配了一遍,两边都不知道对方在干什么,配置漂移、状态不一致、流水线断裂,全来了。 这篇文章拆解 Terraform + Ansible 协同的 5 个核心决策。每个决策都来自实际生产环境的踩坑经验,不是理论推演。如果你的团队正在用或准备用这个组合,这些决策点会帮你少走至少半年的弯路。 一、职责边界:Terraform 管什么,Ansible 管什么 先说清楚一个最基本但最容易被忽视的问题:这两个工具的职责边界到底画在哪里。 Terraform 的强项是基础设施编排——创建云主机、虚拟机、网络、存储、负载均衡、安全组、数据库实例、K8s 集群。它是声明式的,你告诉它"我要 3 台 4C8G 的云主机在这个可用区",它就去创建。它管理资源的整个生命周期:创建、修改、销毁。 Ansible 的强项是系统配置和应用交付——操作系统初始化、账号权限、内核参数、防火墙规则、软件包安装、中间件部署、配置文件渲染、服务启停、定时任务。它是过程式的(虽然也有幂等性设计),你告诉它"先装 Nginx,再拷配置,然后启动服务",它按顺序执行。 两个工具各管一摊,看起来很清楚。但实际生产中,边界经常模糊。举几个常见的"灰色地带": 配置项 Terraform 能做 Ansible 能做 应该谁管 创建云主机 ✅ 原生支持 ❌ 不适合 Terraform 安装 Nginx ✅ remote-exec ✅ 原生支持 Ansible 配置安全组规则 ✅ 原生支持 ⚠️ 能做但不推荐 Terraform 渲染 Nginx 配置文件 ⚠️ local-exec 拼接 ✅ Jinja2 模板 Ansible 磁盘挂载和格式化 ⚠️ 能做但粗糙 ✅ 精细控制 Ansible 创建 DNS 记录 ✅ 原生支持 ⚠️ 能做但不推荐 Terraform 用户和 SSH 密钥 ✅ 能做 ✅ 原生支持 Ansible 决策 1:不要用 Terraform provisioner 做复杂配置 Terraform 提供了 remote-exec 和 local-exec 两个 provisioner,可以在资源创建后执行命令或脚本。很多团队一上来就在 Terraform 里写一长串 remote-exec 块,用 shell 脚本装软件、配防火墙、改内核参数。...