定位分工:Terraform 管基础设施生命周期,Ansible 管系统配置与应用部署,二者互补,2026 运维标准组合。
一、核心职责划分(边界红线)
Terraform 负责:资源编排、创建销毁、拓扑架构
- 云主机、虚拟机、容器集群、网络、存储、负载均衡、安全组
- 域名、证书、对象存储、数据库实例、K8s 集群
- 资源扩缩容、环境销毁、多环境隔离、状态管理
- 不做系统内部配置、软件安装、服务启停
Ansible 负责:系统初始化、配置固化、应用交付
- 操作系统初始化、账号权限、内核参数、防火墙
- 软件包安装、中间件部署、配置文件渲染
- 服务启停、定时任务、巡检脚本、业务应用部署
- 不创建底层硬件/云资源实例
二、组合使用标准架构
- Terraform:拉起裸资源 → 输出主机 IP/主机名
- TF 输出自动注入 Ansible Inventory
- Ansible:批量初始化、配置、部署服务
- 变更统一提交 Git,GitOps 流水线统一调度
三、目录规范(企业通用标准)
infra-iac/
├── terraform/ # 基础设施层
│ ├── modules/ # 通用资源模块
│ │ ├── ecs/ vm/ network/ k8s/ storage
│ ├── environments/ # 环境隔离
│ │ ├── dev/ test/ prod
│ │ │ ├── main.tf
│ │ │ ├── variables.tf
│ │ │ ├── outputs.tf
│ │ │ └── terraform.tfvars
│ └── backend.tf # 远程状态配置
├── ansible/ # 配置部署层
│ ├── inventories/ # 动态静态主机清单
│ ├── roles/ # 可复用角色
│ │ ├── base-init/ nginx/ mysql/ app-server
│ ├── group_vars/ host_vars # 分组变量
│ ├── playbooks/ # 执行剧本
│ └── ansible.cfg # 全局配置
├── .gitlab-ci.yml # CI统一调度TF+Ansible
└── README.md
四、Terraform 专属最佳实践
1. 状态管理规范
- 禁止本地 state 文件,统一远程后端:对象存储+状态锁
- 云厂商 OSS/S3/自建 MinIO 存储状态,多人协作防并发篡改
hcl
# backend.tf 标准配置
terraform {
backend "oss" {
bucket = "tf-state-manage"
key = "prod/infra/terraform.tfstate"
region = "cn-hangzhou"
}
}
2. 模块化拆分
- 通用资源抽成 Module,复用网络、虚拟机、安全组
- 环境目录仅传变量,不写重复资源代码
- 版本固定 Provider,避免插件升级故障
3. 变量与输出规范
- variables.tf 定义类型、描述、约束,禁止硬编码参数
- outputs.tf 输出主机 IP、实例 ID,对接 Ansible
- 敏感数据用变量文件,绝不明文提交 Git
4. 运维操作准则
- 所有变更走
terraform plan预览,确认后再 apply - 生产禁止强制刷新、强制销毁,变更留评审记录
- 资源漂移以代码为准,重新 apply 对齐配置
- 废弃资源代码同步删除,杜绝僵尸资源
5. 多环境隔离方案
- 方案 1:独立目录隔离 dev/test/prod
- 方案 2:Workspace 工作空间切换环境
- 环境参数分离,共用模块保证架构一致
五、Ansible 专属最佳实践
1. 清单管理:优先动态清单
- Terraform 输出 IP 自动生成 Ansible Inventory
- 按业务分组:web 组、db 组、监控组,批量操作
- 关闭密码登录,统一 SSH 密钥认证
2. Role 角色化复用
- 系统初始化、中间件、业务服务拆独立 Role
- 统一入口 playbook 编排多个角色执行顺序
- 配置文件模板化,变量动态渲染
3. 变量分层管控
- 全局变量 → 分组变量 → 主机私有变量,层级覆盖
- 密码、密钥启用 Ansible Vault 加密,禁止明文入库
4. 执行规范
- 先
ansible-playbook --check干跑校验 - 分批执行,禁止一次性全量变更生产集群
- 编写回滚剧本,故障快速复原
5. 权限与安全
- 最小权限执行,禁用 root 直接操作业务
- 关闭高危命令执行权限,操作日志留存审计
六、TF+Ansible 联动核心方案
方式 1:TF 输出生成 Ansible 静态清单
terraform 输出主机地址,写入 ini/yaml 清单,Ansible 读取执行
hcl
# outputs.tf 输出主机列表
output "vm_ips" {
value = alicloud_instance.web.*.private_ip
}
# 本地生成inventory文件
resource "local_file" "ansible_inv" {
content = <<EOT
[web]
${join("\n",alicloud_instance.web.*.private_ip)}
EOT
filename = "../../ansible/inventories/env.ini"
}
方式 2:CI 流水线串行调度
流程:
- Git 提交代码 → CI 触发校验
- 执行 terraform init → plan → apply 创建资源
- 自动调用 ansible-playbook 初始化配置、部署应用
- 执行健康检查,失败终止流程
方式 3:Terraform provisioner 回调 Ansible
资源创建完成后,本地调用 ansible 命令执行配置初始化。
七、统一 GitOps 管控规范
-
代码唯一可信源
禁止控制台手动改云资源、服务器配置,全部代码化
-
分支策略
- main:生产稳定版本,仅 MR 合并
- dev:开发测试变更分支
- 提交自动语法校验、漏洞扫描
-
变更流程
编写代码 → 本地验证 → 提交 PR → 自动 Plan 校验 → 人工评审 → 合并自动部署
-
版本回溯
Git 标签标记上线版本,故障回退对应代码版本即可
八、安全最佳实践
- 云 AK、SSH 密钥、数据库密码加密存储,不提交代码库
- Terraform 状态文件权限收紧,防止敏感信息泄露
- Ansible Vault 加密核心配置,流水线解密执行
- CI 流程嵌入漏洞扫描、配置合规检测
九、性能与稳定性优化
- Terraform:资源依赖合理编排,减少无效重建
- Ansible:开启并行执行,优化批量部署速度
- 定期清理无用模块、废弃代码,精简维护成本
- 同环境软硬件版本统一,降低异构故障
十、常见避坑点
- 边界混乱:不要用 Ansible 创建云主机,不要用 TF 写系统配置
- 状态丢失:必须开启远程状态+锁定,杜绝本地 state 丢失
- 硬编码:所有环境参数、地址统一抽变量
- 无预览直接上线:生产变更必须先 plan、先 check 校验
- 多人员同时操作:借助状态锁、分支管控规避并发冲突
十一、极简落地流程
- 搭建统一 IaC 仓库,划分 TF 与 Ansible 目录
- 封装通用资源模块、系统初始化 Role
- 编写多环境变量,实现资源拉起+配置联动
- 接入 CI 流水线,自动化创建、配置、校验
- 统一变更规范,切换代码驱动运维模式