Skip to content

基础设施即代码

前言

你有没有经历过这种噩梦:线上服务器挂了,但没人记得当初是怎么配置的? 手动登录服务器、凭记忆敲命令、祈祷不要敲错——这就是传统运维的日常。基础设施即代码(Infrastructure as Code,IaC)彻底改变了这一切:用代码来定义和管理基础设施,让服务器配置像软件一样可版本控制、可复现、可审计。

这篇文章会带你学什么?

学完这章后,你将获得:

  • 核心概念:理解 IaC 是什么,为什么它是现代运维的基石
  • 工作流认知:掌握 Terraform 的 Write → Plan → Apply → Destroy 四阶段流程
  • 工具选型:了解 Terraform、Pulumi、CloudFormation 等主流工具的优劣
  • 风险意识:理解配置漂移的危害和检测方法
  • 最佳实践:掌握 IaC 项目的工程化管理方法
章节内容核心概念
第 1 章IaC 概念手动运维 vs 代码化管理
第 2 章Terraform 工作流Write → Plan → Apply
第 3 章工具对比Terraform、Pulumi、CDK
第 4 章配置漂移检测、预防、修复
第 5 章最佳实践模块化、状态管理、CI/CD

0. 全景图:为什么基础设施也需要"源代码"?

想象你是一个厨师。如果每道菜都凭感觉做,今天放一勺盐、明天放两勺,味道永远不稳定。但如果你把配方写下来——精确到每种调料的克数——任何人都能复现同样的味道。

基础设施管理面临的是同样的问题。一台服务器的配置可能涉及操作系统、网络规则、安全组、存储卷、环境变量等几十个参数。手动配置不仅容易出错,而且不可复现、不可审计、不可回滚

IaC 的核心价值

  • 可复现:同一份代码,无论执行多少次,结果都一样(幂等性)
  • 可版本控制:基础设施变更通过 Git 管理,谁改了什么、为什么改,一目了然
  • 可审计:所有变更都有记录,满足合规要求
  • 可自动化:通过 CI/CD 流水线自动部署,消除人为操作风险
  • 可协作:团队成员通过 Pull Request 审查基础设施变更,就像审查代码一样

1. IaC 概念:从"手动点击"到"代码声明"

传统运维的工作方式是:登录云平台控制台,手动点击创建服务器、配置网络、设置安全组。这种方式在管理几台服务器时还能应付,但当规模扩大到几十、几百台时,就变成了噩梦。

IaC 的核心思想是:用声明式代码描述你想要的基础设施状态,让工具自动帮你实现。你不需要告诉工具"先创建 VPC,再创建子网,再创建安全组"(命令式),只需要说"我要一个这样的网络环境"(声明式),工具会自动计算出需要执行的步骤。

交互演示 ── 手动运维 vs 基础设施即代码
手动运维流程
1
🌐
登录云控制台
需要记住密码
2
🖥️
手动创建服务器
配置可能遗漏
3
🔧
配置安全组规则
容易开放过多端口
4
💾
挂载存储卷
大小可能选错
5
🔗
配置负载均衡
路由规则易出错
6
📋
手动记录到文档
文档很快过时
对比维度手动运维基础设施即代码
可重复性每次操作可能不同代码保证完全一致
速度分钟到小时级秒到分钟级
审计追踪依赖人工记录Git 历史自动记录
协作口头传达、截图Code Review、PR 流程
回滚几乎不可能git revert 一键回滚
维度手动运维基础设施即代码
操作方式登录控制台点击编写代码文件
可复现性依赖文档和记忆代码即文档,100% 可复现
变更追踪无记录或记录不全Git 版本控制,完整历史
协作方式口头沟通、文档传递Pull Request 审查
回滚能力手动逆向操作git revert + 重新 apply
一致性环境间差异大开发/测试/生产完全一致

声明式 vs 命令式

  • 声明式(Declarative):描述"我要什么",工具自动计算"怎么做"。Terraform、CloudFormation 采用这种方式。优点是幂等性好,缺点是灵活性受限。
  • 命令式(Imperative):描述"怎么做",一步步执行。Ansible、Shell 脚本采用这种方式。优点是灵活,缺点是难以保证幂等性。
  • 混合式:Pulumi、AWS CDK 用通用编程语言编写,兼具声明式的状态管理和命令式的灵活性。

2. Terraform 工作流:Write → Plan → Apply

Terraform 是目前最流行的 IaC 工具,由 HashiCorp 开发。它的工作流程清晰直观,分为四个阶段,就像软件开发的"编码→审查→部署→清理"。

交互演示 ── Terraform 工作流四阶段
📝Write
🔍Plan
🚀Apply
🗑️Destroy
📝Write ── 编写基础设施代码

用声明式语言(HCL)描述你期望的基础设施状态。代码就是文档,可以提交到 Git 进行版本管理和 Code Review。

Terminal
📄使用 .tf 文件描述资源
🔧HCL 语法简洁易读
📦支持模块化复用

四阶段工作流

  1. Write(编写):用 HCL(HashiCorp Configuration Language)编写基础设施定义文件(.tf)。声明你需要的资源:服务器、数据库、网络等。
  2. Plan(计划):运行 terraform plan,Terraform 会对比当前状态和目标状态,生成一份"执行计划"——告诉你它打算创建、修改、删除哪些资源。这是安全网,让你在真正执行前确认变更。
  3. Apply(执行):确认计划无误后,运行 terraform apply,Terraform 按计划创建或修改资源。执行完成后,当前状态会保存到状态文件(terraform.tfstate)。
  4. Destroy(销毁):不再需要时,运行 terraform destroy 清理所有资源,避免产生不必要的费用。
命令作用是否修改基础设施使用场景
terraform init初始化项目,下载 Provider首次使用或添加新 Provider
terraform plan预览变更,生成执行计划每次变更前必须执行
terraform apply执行变更,创建/修改资源确认 plan 后执行
terraform destroy销毁所有资源清理测试环境、下线服务
terraform state查看/管理状态文件视操作而定状态迁移、资源导入

3. 工具对比:选择适合你的 IaC 工具

IaC 领域有多种工具,各有侧重。选择工具时需要考虑团队技术栈、云平台、项目规模等因素。没有"最好"的工具,只有最适合你场景的工具。

交互演示 ── 主流 IaC 工具对比
选择要对比的工具(至少选 2 个):
特性🟣Terraform🟠CloudFormation
厂商HashiCorpAWS
配置语言HCLYAML / JSON
声明式/命令式声明式声明式
多云支持原生多云仅 AWS
状态管理State 文件AWS 托管
学习曲线中等中等偏高
社区生态非常活跃AWS 生态
最佳场景多云/混合云纯 AWS 环境
点击下方工具名称查看详细介绍和代码示例
工具语言云平台支持学习曲线适用场景
TerraformHCL多云(AWS/Azure/GCP)中等多云环境、团队协作
PulumiPython/TS/Go多云低(熟悉编程语言)开发者友好、复杂逻辑
AWS CloudFormationJSON/YAML仅 AWS中等纯 AWS 环境
AWS CDKPython/TS/Java仅 AWSAWS + 编程语言偏好
AnsibleYAML多云 + 裸机配置管理、混合环境

如何选择?

  • 初创团队 / 单云:CloudFormation(AWS)或对应云平台原生工具,生态集成最好
  • 多云 / 中大型团队:Terraform,社区最大、Provider 最丰富、招聘最容易
  • 开发者主导的团队:Pulumi 或 CDK,用熟悉的编程语言写基础设施,IDE 支持好
  • 需要配置管理:Ansible,擅长服务器内部配置(安装软件、修改配置文件)

4. 配置漂移:无声的定时炸弹

配置漂移(Configuration Drift)是 IaC 实践中最隐蔽的敌人。它指的是实际基础设施状态与代码定义的状态之间逐渐产生偏差

这种偏差通常是怎么产生的?有人为了"快速修复"一个线上问题,直接登录控制台手动改了安全组规则;有人为了调试,临时加大了某台服务器的配置但忘了改回来。这些"小改动"日积月累,最终导致代码和实际环境严重脱节。

交互演示 ── 配置漂移:无声的定时炸弹
初始部署
手动修改
又一次修改
漂移加剧
IaC 检测
期望状态(代码定义)
🖥️
Server-A
Nginx 1.24 | 443 | 2GB
🖥️
Server-B
Nginx 1.24 | 443 | 2GB
🖥️
Server-C
Nginx 1.24 | 443 | 2GB
状态一致
实际状态(线上环境)
🖥️
Server-A
Nginx 1.24 | 443 | 2GB
🖥️
Server-B
Nginx 1.24 | 443 | 2GB
🖥️
Server-C
Nginx 1.24 | 443 | 2GB
第 0 步:通过 IaC 初始部署

团队使用 Terraform 部署了 3 台 Web 服务器,配置完全一致:Nginx 1.24、端口 443、2GB 内存。代码和实际状态完美匹配。

关键教训
🚫禁止手动修改线上环境,所有变更必须通过代码
🔍定期运行 terraform plan 检测漂移
🔒限制生产环境的 SSH 权限,减少人为干预
📋建立变更审批流程(PR → Review → Merge → Apply)

配置漂移的危害

  1. 不可复现:代码描述的环境和实际环境不一致,新建环境时会出问题
  2. 回滚失败:以为回滚到上一版本就能恢复,但实际环境已经被手动修改过
  3. 安全隐患:手动开放的端口、放宽的权限可能被遗忘,成为攻击入口
  4. 审计失效:合规审计基于代码,但代码不反映真实状态
预防措施说明
禁止手动变更通过 IAM 策略限制控制台操作权限
定期漂移检测定时运行 terraform plan 检查差异
自动修复检测到漂移后自动执行 apply 恢复一致性
变更审计开启 CloudTrail 等审计日志,追踪所有变更来源

5. 最佳实践:让 IaC 项目可持续演进

IaC 代码和应用代码一样,需要良好的工程实践来保证可维护性。随着基础设施规模增长,没有章法的 IaC 代码会变成另一种形式的"技术债"。

交互演示 ── IaC 最佳实践
📂
实践一:基础设施代码纳入版本控制
像管理应用代码一样管理基础设施代码
✅ 推荐做法
所有 .tf 文件提交到 Git 仓库
使用分支策略(main / dev / feature)
通过 Pull Request 进行代码审查
在 CI 中自动运行 terraform plan
❌ 反面模式
在本地执行 apply 后不提交代码
直接在 main 分支上修改
将 .tfstate 文件提交到 Git
跳过 Code Review 直接部署
.gitignore 示例
# 忽略本地状态文件
*.tfstate
*.tfstate.backup
.terraform/

# 忽略敏感变量文件
*.tfvars
!example.tfvars
实践成熟度
入门
基础
进阶
成熟
卓越

六条核心最佳实践

  1. 模块化:将可复用的基础设施抽象为模块(如 VPC 模块、数据库模块),避免复制粘贴。就像写函数一样,一处定义、多处调用。
  2. 环境隔离:开发、测试、生产使用独立的状态文件和变量文件,通过 workspace 或目录结构隔离。
  3. 远程状态管理:状态文件(tfstate)存储在远程后端(S3 + DynamoDB),支持团队协作和状态锁定,避免并发冲突。
  4. 敏感信息管理:密码、密钥等敏感信息不要写在代码里,使用 Vault、AWS Secrets Manager 等工具管理。
  5. CI/CD 集成:将 terraform plan 集成到 PR 流程,apply 通过流水线自动执行,杜绝本地手动操作。
  6. 代码审查:基础设施变更和应用代码一样需要 Code Review,尤其是涉及安全组、IAM 策略的变更。

总结

基础设施即代码是现代云原生运维的基石。它把"不可描述的手动操作"变成了"可版本控制的代码",让基础设施管理从"艺术"变成了"工程"。

回顾本章的关键要点:

  1. IaC 的本质:用代码声明基础设施的期望状态,让工具自动实现
  2. Terraform 工作流:Write → Plan → Apply 三步走,Plan 是安全网
  3. 工具选型:多云选 Terraform,单云选原生工具,开发者团队选 Pulumi
  4. 配置漂移:最隐蔽的风险,需要通过流程和工具双重防护
  5. 工程化管理:模块化、环境隔离、远程状态、CI/CD 集成缺一不可

延伸阅读