IaC 双引擎:Terraform + Ansible 完整最佳实践

定位分工:Terraform 管基础设施生命周期,Ansible 管系统配置与应用部署,二者互补,2026 运维标准组合。

一、核心职责划分(边界红线)

Terraform 负责:资源编排、创建销毁、拓扑架构

  • 云主机、虚拟机、容器集群、网络、存储、负载均衡、安全组
  • 域名、证书、对象存储、数据库实例、K8s 集群
  • 资源扩缩容、环境销毁、多环境隔离、状态管理
  • 不做系统内部配置、软件安装、服务启停

Ansible 负责:系统初始化、配置固化、应用交付

  • 操作系统初始化、账号权限、内核参数、防火墙
  • 软件包安装、中间件部署、配置文件渲染
  • 服务启停、定时任务、巡检脚本、业务应用部署
  • 不创建底层硬件/云资源实例

二、组合使用标准架构

  1. Terraform:拉起裸资源 → 输出主机 IP/主机名
  2. TF 输出自动注入 Ansible Inventory
  3. Ansible:批量初始化、配置、部署服务
  4. 变更统一提交 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. 运维操作准则

  1. 所有变更走terraform plan预览,确认后再 apply
  2. 生产禁止强制刷新、强制销毁,变更留评审记录
  3. 资源漂移以代码为准,重新 apply 对齐配置
  4. 废弃资源代码同步删除,杜绝僵尸资源

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 流水线串行调度

流程:

  1. Git 提交代码 → CI 触发校验
  2. 执行 terraform init → plan → apply 创建资源
  3. 自动调用 ansible-playbook 初始化配置、部署应用
  4. 执行健康检查,失败终止流程

方式 3:Terraform provisioner 回调 Ansible

资源创建完成后,本地调用 ansible 命令执行配置初始化。

七、统一 GitOps 管控规范

  1. 代码唯一可信源

    禁止控制台手动改云资源、服务器配置,全部代码化

  2. 分支策略

    • main:生产稳定版本,仅 MR 合并
    • dev:开发测试变更分支
    • 提交自动语法校验、漏洞扫描
  3. 变更流程

    编写代码 → 本地验证 → 提交 PR → 自动 Plan 校验 → 人工评审 → 合并自动部署

  4. 版本回溯

    Git 标签标记上线版本,故障回退对应代码版本即可

八、安全最佳实践

  1. 云 AK、SSH 密钥、数据库密码加密存储,不提交代码库
  2. Terraform 状态文件权限收紧,防止敏感信息泄露
  3. Ansible Vault 加密核心配置,流水线解密执行
  4. CI 流程嵌入漏洞扫描、配置合规检测

九、性能与稳定性优化

  1. Terraform:资源依赖合理编排,减少无效重建
  2. Ansible:开启并行执行,优化批量部署速度
  3. 定期清理无用模块、废弃代码,精简维护成本
  4. 同环境软硬件版本统一,降低异构故障

十、常见避坑点

  1. 边界混乱:不要用 Ansible 创建云主机,不要用 TF 写系统配置
  2. 状态丢失:必须开启远程状态+锁定,杜绝本地 state 丢失
  3. 硬编码:所有环境参数、地址统一抽变量
  4. 无预览直接上线:生产变更必须先 plan、先 check 校验
  5. 多人员同时操作:借助状态锁、分支管控规避并发冲突

十一、极简落地流程

  1. 搭建统一 IaC 仓库,划分 TF 与 Ansible 目录
  2. 封装通用资源模块、系统初始化 Role
  3. 编写多环境变量,实现资源拉起+配置联动
  4. 接入 CI 流水线,自动化创建、配置、校验
  5. 统一变更规范,切换代码驱动运维模式
相关推荐
步步为营DotNet1 天前
深入.NET 11:.NET Aspire 在云原生资源编排与管理的卓越实践
云原生·.net
密瓜智能1 天前
HAMi 正式接入 Kubernetes DRA:下一代 GPU 资源模型实践指南
云原生·容器·kubernetes
Elastic 中国社区官方博客1 天前
用于调试 LLM 延迟、成本和 GPU 饱和度的 ES|QL 查询
大数据·人工智能·elasticsearch·搜索引擎·ai·云原生·serverless
李李李li1 天前
debian13.3安装k8s
云原生·容器·kubernetes
姚不倒1 天前
Go语言实战:构建一个安全的计算器服务(接口、错误处理与Panic恢复)
云原生·golang
AI云原生1 天前
远程控制软件进入协作阶段:ToDesk、向日葵、AnyDesk、RustDesk怎么选?
运维·服务器·网络·windows·docker·云原生·开源软件
虎头金猫2 天前
管理飞牛OS还在点点点?我用Ansible给它装了个远程遥控器
微信·开源·ansible·aigc·智能家居·开源软件·ai编程
阿里云云原生2 天前
阿里云 STAROps 全域智能运维平台发布!从“被动救火”到“主动自治”
云原生
35岁程序员的自救之路2 天前
AiBBS - 面向下一个十年的AI + 云原生社区系统
人工智能·云原生