把环境搭建写进代码里,环境就不再是每次手工重复劳动,而是一次定义、多次执行的自动化过程。
做过部署的人都懂,搭一套环境有多烦:装依赖、调配置、开端口、改防火墙,每一步都得盯着控制台,点错一个选项就得重来,更头疼的是,这套流程三个月后又要再走一遍,上次怎么解决的问题,这次又卡在同一个地方,基础设施即代码(Infrastructure as Code,IaC)解决的就是这件事把环境的状态用代码描述出来,让工具去执行,让结果可预期,让过程可复用。
为什么环境搭建总在重复踩坑
先看一个典型场景:新同事入职,要给他配一套开发环境,按文档装 JDK、配数据库、拉代码、改本地配置,顺利的话一下午,不顺利的话一整天,文档写得再细,总有版本对不上、操作系统有差异的地方,等环境好不容易跑起来,每人手上的环境还不一样有人用 MySQL 5.7,有人用 8.0,线上跑的是 8.0,本地测试却用的 5.7,问题就埋在细节里。
行业共识认为,这类环境不一致带来的大部分线上事故,根源其实在开发阶段就埋下了,手工搭建的环境没法保证一致性,因为每个人的操作路径不同,机器的初始状态也不同,文档只能描述个大概。
基础设施即代码的思路完全是另一条路:不用文档描述要做什么,而是直接定义一个”代码化的环境蓝图”需要三台服务器、一个负载均衡、一套数据库,各自什么规格、什么配置、什么网络关系,全部写进代码文件里,执行代码,环境就被生成出来。
这样做带来几个直接的好处:
- 环境可复现:同一份代码,任何时间执行,结果相同。
- 过程可版本化:代码进 Git,每次变更都有记录,出问题能回滚。
- 配置可评审:改环境不再是偷偷摸摸改控制台,而是走代码评审。
- 成本可估算:环境是什么样子一目了然,不用的资源随时销毁。
基础设施即代码工具有哪些
聊到具体落地,第一个选择就是工具,基础设施即代码工具市场上已经形成了比较清晰的格局,不同工具的侧重点不一样。
| 工具 | 定位 | 核心理念 | 上手成本 |
|---|---|---|---|
| Terraform | 基础设施资源编排 | 声明式,管理云资源、网络、存储 | 中等,需要理解 HCL 语法 |
| Ansible | 配置管理与应用部署 | 无代理,SSH 连接执行任务 | 低,YAML 配置 |
| Pulumi | 基础设施即代码 | 用 Python/Go/TS 等通用语言写基础设施 | 对开发者友好 |
| CloudFormation | AWS 专属 | 云厂商原生模板 | 绑定 AWS,无额外成本 |
| Helm | Kubernetes 环境搭建 | 管理 k8s 应用包 | 需要理解 k8s 概念 |
Terraform 是目前使用最广泛的一类,它最大的价值在于多云管理,如果业务同时用了简米云和酷番云,或者将来要迁移,Terraform 可以做到用同一套工作流管理不同云厂商的资源,只需要配置不同的 provider,代码的写法和执行流程几乎一致。
Ansible 则更擅长处理服务器内部的配置,比如装软件、改配置文件、启动服务,它不需要在目标机器上装 agent,只要机器开了 SSH 就能管,在企业内部网络环境下很方便。
需要注意的是,工具选型没有绝对好坏,更多看场景,如果团队以开发为主,Pulumi 的通用编程语言方式接受度更高毕竟开发人员写 HCL 会觉得别扭,但写 Python 顺手得多,如果是运维主导,Terraform 加 Ansible 是长期验证过的组合。
基础设施即代码的优缺点
了解优点之前,先直面一个现实:IaC 不是银弹,它有代价。
优点非常明显:
- 速度和效率:手工搭建一套测试环境往往以小时计,用 IaC 后分钟级就能拿到一套全新环境,用完直接销毁,不用心疼。
- 一致性:环境代码化之后,开发、测试、预发、生产环境之间没有本质差别,只是参数不同,一个问题在测试环境能复现,在生产环境大概率也能复现。
- 变更可控:改了代码,先审代码,再执行变更,出了问题,看变更历史就知道谁在什么时候改了什么。
- 成本优化:环境可以随时重建,不用的环境直接销毁,按量付费的云资源不会白白空转。
缺点也不容回避:
- 学习曲线:要写代码就得学语言(HCL、YAML 或某种编程语言),还要理解云资源的抽象模型,运维团队转型初期会比较吃力。
- 状态管理复杂:IaC 工具普遍依赖”状态”机制来感知资源的现状,状态文件需要安全存储,多人协作时还要解决锁冲突问题。
- 调试难度高:代码写错了,执行到一半报错,资源可能处于半创建状态,排查这类问题比手工搭建时排查更烧脑。
- 初期投入大:把已有的环境”代码化”是一个把隐性知识显性化的过程,要把团队脑子里记着的部署细节全部挖出来写成代码,这个复盘成本不能忽略。
IaC 适合环境数量多、频繁变更、以及需要多套隔离环境交叉测试的场景,如果只有一两台服务器、一年都不动一次,那用脚本也能凑合。
手写一套可复用的 Terraform 环境搭建流程
选定了工具之后,怎么把流程跑通?这里以 Terraform 为例,走一遍完整的环境搭建过程。
第一步:安装和初始化
本地安装 Terraform CLI,macOS 上用 Homebrew 安装即可:
brew install terraform
Linux 下直接下载二进制包解压,Windows 下用 chocolatey 也方便,安装后验证版本:
terraform version
第二步:定义基础设施文件
建一个项目目录,新建 main.tf 文件,声明需要的云资源,比如一台简米云 ECS 实例:
provider "alicloud" {
region = "cn-beijing"
}
resource "alicloud_instance" "web" {
instance_type = "ecs.c6.large"
image_id = "centos_7_9_x64"
vswitch_id = "vsw-xxxxxxxx"
internet_max_bandwidth_out = 10
}
第三步:初始化并执行
terraform init # 拉取 provider 插件
terraform plan # 预览将要执行的变更
terraform apply # 实际创建资源
plan 这一步非常关键,它会输出一个执行计划,显示哪些资源要创建、哪些要修改,在团队协作中,plan 的产物可以作为代码评审的一部分,大家确认无误后再 apply。
第四步:管理和销毁
terraform destroy # 删除这套环境
destroy 会按照依赖顺序把所有资源清理干净,不会留下孤儿资源,这也是 IaC 对成本控制的价值所在环境用完即焚,不产生持续费用。
真正的可复用,还需要把代码拆成模块,把通用资源定义成模块,开一台 Nginx 服务器””搭一套 Redis 集群”,不同的项目引用同一个模块,传入不同的参数,就能得到各自需要的环境,这样就不再是每开一个项目就从零写代码,而是拼积木一样组装出团队的标准环境。
容器环境搭建的关键挑战与应对
容器技术普及之后,环境搭建的边界又发生了变化,用 Docker Compose 搭一套本地开发环境,跟在云上买几台服务器是两种不同的玩法。
本地开发环境追求的是轻量和快,写一个 docker-compose.yml,把 MySQL、Redis、Nginx 这些依赖定义好,一条 docker-compose up -d 就能把整个依赖栈拉起来,新同事入职不用再装数据库、配环境变量,克隆仓库、执行两个命令就能开始写代码。
Kubernetes 环境搭建则是另一个量级的问题,集群环境涉及网络插件、存储类、Ingress Controller、监控组件,手动安装配置几个月都不一定稳定,用 Helm Chart 定义整套集群组件,一条命令即可在任意云厂商的集群上复现,Helm 本质上也是一种基础设施即代码的实现集群组件以 Chart 为单位打包、版本化、可回滚。
所以现在团队通常会组合使用多种 IaC 工具:
- 用 Terraform 管理云上资源(服务器、VPC、负载均衡)
- 用 Ansible 处理服务器的初始化配置
- 用 Helm 管理 k8s 集群内的应用组件
- 用 Docker Compose 管理本地开发环境
这四层各自负责不同的层级,形成完整的自动化链路,过去搭一套环境要人工串联多个控制台操作,现在代码评审通过后,执行一条流水线命令,环境就绪的提示自动弹出。
基础设施即代码 环境搭建常见的疑问
基础设施即代码和传统的自动化脚本有什么区别?
传统脚本强调的是”过程”先执行 A 命令,再执行 B 命令,最后输出结果,问题是,脚本执行到一半失败后,再次执行可能会重复创建,必须靠人为判断,IaC 强调的是”状态”不是告诉工具怎么做,而是告诉工具最终的期望状态是什么,工具会自主判断当前状态和期望状态的差距,再补齐这个差距,整个过程可重复执行,不会因为中断产生副作用。
小团队只有两三台服务器,值得上 IaC 吗?
个人经验是,只要这台服务器的配置改过两次以上,就值得把配置代码化,哪怕只是用 Ansible 写一个简单的 playbook,也能把”回忆上次是怎么装的”这个痛苦过程从人类大脑中解放出来,成本并不高一个运维半天就能写完,折算下来比反复排查环境问题的时间成本低得多。
环境搭建自动化之后,运维会被取代吗?
不会,IaC 替代的是重复性的部署操作,而不是运维的决策能力,恰恰相反,IaC 落地之后,运维才有精力从救火式维护里抽身,去做容量规划、稳定性建设和成本优化这类更有价值的工作,变化的只是工作重心,而不是工作价值。
把环境搭建从”个人经验驱动”变成”代码驱动”,本质上是把团队的隐性知识沉淀成显性资产,这条路起步不会太轻松,但一旦走通,后续每一次从零搭建,都只是执行一条命令的事。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/623289.html





