不用手动 SSH 登服务器!Terraform 与 IaC(代码即基础设施)如何管理千台云主机?
2026-08-14 · DevCraft Studio
还在 SSH 进去一台台手敲命令?基础设施即代码(IaC)用几行声明式代码,就能在 AWS、阿里云上一键拉起成百上千台配置相同的机器。这篇用大白话讲清 Terraform 怎么干活、和 Ansible 怎么分工,以及 GitOps 怎么让 Git 仓库直接驾驶你的云端。
先来一个灵魂拷问:你有没有过这样的经历——凌晨两点,老板在群里喊"线上那批机器配置不对,赶紧改一下",你迷迷糊糊 SSH 上去,啪啪敲了一通命令,结果把测试环境的数据库给干掉了?或者更常见的:你照着昨天的笔记,在一台新服务器上一字不差地敲命令,最后却发现两台机器跑出来的结果就是不一样,因为你忘了其中一步?
这其实就是"手动运维"最真实的样子。过去十几年,绝大多数人管理服务器靠两样东西:云厂商网页控制台上一顿乱点,加上 SSH 进去手敲命令。这种方式在小打小闹时还行,一旦机器上了规模,立刻露出三大老毛病,而且每一个都够你喝一壶的。
延伸阅读
更多相关攻略推荐:连云厂商也看不到你的数据?机密计算(Confidential Com、被割裂的"云上互联网":数据主权(GDPR)、本地化存储与主权云(S、为什么你自己 VPS 发的邮件总进垃圾箱?邮件协议(SPF、DKIM、百兆带宽如何流畅看 4K?视频切片(HLS/DASH)、AVIF 压、告别繁琐密码:OAuth 2.0、SSO 单点登录与 Passkey。
传统运维的三个老毛病:易错、难复现、没法审计
第一个毛病叫容易出错。人在疲劳、匆忙、压力大的时候,敲错一个参数、配错一个端口是常事。更可怕的是,这种错误往往是"silent"的——当时看不出问题,三天后才爆雷。第二个毛病叫无法复现。你明明在开发环境跑得好好的,一到生产环境就炸,因为两台机器的配置其实早就"漂移"了,你却不知道哪一步不一样。圈子里管这种环境叫"snowflake"(雪花机)——每一台都独一无二、不可复制。第三个毛病叫没法审计。等出事了想追责,"谁改了什么、什么时候改的",没人答得上来,因为一切都是手动敲的,没有记录。
再想想扩展的场景:老板说"大促前给我扩到 100 台一模一样的机器"。手动一台台 SSH 配?光想想就头大。这就是为什么行业后来搞出了一套新玩法——代码即基础设施(Infrastructure as Code,简称 IaC)。
什么叫"代码即基础设施"?
用一句大白话解释:把服务器、网络、数据库这些"硬件",像写软件代码一样写成文本文件,然后用工具一键把它们变成真实的云上资源。你不再去控制台点点点,也不再 SSH 进去敲命令,而是写一份"说明书",告诉云:"我要 100 台 t2.micro 的机器,装好 Nginx,开放 80 和 443 端口",然后工具自动帮你搞定。
这套玩法的核心思想特别妙:把基础设施当成软件来对待。既然是软件,那软件开发的好东西就全都能用上了——放进 Git 做版本控制、让同事走 Pull Request 做代码评审、写自动化测试、接上 CI/CD 流水线。你的基础设施从此变成了一份"活文档":谁改了什么、为什么改,Git 历史里一清二楚。
声明式 vs 命令式:说"我要什么"还是说"怎么做"
IaC 工具分两大流派,区别在于"你怎么描述基础设施":
- 声明式(Declarative):你只描述目标状态(What),工具自己算怎么达到(How)。比如写"我要一台 2G 内存的机器",至于云底层怎么创建,你不管。代表工具是 Terraform、AWS CloudFormation。
- 命令式(Imperative):你一步步写具体操作(How)。比如"SSH 登录 → 执行 yum install nginx → 启动服务"。代表工具是 Ansible(偏过程式)、Shell 脚本。
声明式最大的好处是幂等(idempotent)——同一份代码你跑十遍,结果都是一样的,不会越跑越乱。这也从根本上消灭了"配置漂移"。对初学者记住一句话就行:你想描述"终点长什么样",就用声明式;你想描述"一步步怎么走",就用命令式。
Terraform:怎么做到"写几行代码启动一堆机器"?
Terraform 是目前最火的开源 IaC 工具,由 HashiCorp 开发。它用一种叫 HCL(HashiCorp Configuration Language)的专属语言写配置。它干活有一套标准四步走,记住这四个词就够了:
- Write(写):在
.tf文件里声明你要的资源。 - Init(初始化):下载对应云厂商的"插件"(Terraform 管这叫 Provider)。
- Plan(预览):跑一遍"演习",告诉你"这次会新建/修改/删除哪些资源"。相当于发动车前的体检报告。
- Apply(执行):确认无误后真正去云上创建资源。
terraform init # 下载 Provider 插件terraform plan # 预览将要发生的变更(不真正执行)terraform apply # 真正创建/修改资源terraform destroy # 一键销毁所有资源(下班关机专用)
这里有个关键角色叫状态文件(terraform.tfstate)。它相当于 Terraform 的"账本",记录了"代码里写的"和"云上真实的"之间的对应关系。靠这个账本,Terraform 才能知道你上次创建了什么、这次只改了一台还是一百台。团队协作用时,这个账本要存到远程(比如 AWS S3 + DynamoDB 锁),绝不能提交进 Git,因为它可能藏着敏感信息。Terraform 在 2023 年 8 月因许可证变更催生了开源分支 OpenTofu,也正是因为大家太依赖这个状态机制了。
Terraform 的另一个绝活是多云通吃:它背后有 3000 多个 Provider 插件,能管 AWS、Azure、Google Cloud,连 Cloudflare 的 DNS、GitHub 的仓库都能一起管。换句话说,你用同一种语言、同一套工作流,就能指挥一大票不同的云。小背景:Terraform 0.1 早在 2014 年 7 月 28 日就发布了(当时只支持 AWS 和 DigitalOcean),1.0 正式版到 2021 年 6 月才出,而 IBM 在 2024 年 4 月宣布以 64 亿美元收购 HashiCorp——可见这门技术沉浮了多久才成了气候。
一行代码启动 100 台一模一样的机器
回答标题里的那个问题——"怎么瞬间起 100 台配置相同的机器"?秘密就在 HCL 里一个叫 count 的小参数。你看下面这段代码:
resource "aws_instance" "web" {count = 100ami = "ami-0c55b159cbfafe1f0"instance_type = "t2.micro"tags = {Name = "web-server"}}
就这一个 count = 100,一条 terraform apply 下去,AWS 上立刻多出 100 台配置完全一致的机器。明天老板说要 150 台?把数字改成 150 再 apply,Terraform 会自动新建那多出来的 50 台,原有的 100 台纹丝不动。这种"增量的、可预期的"变更,就是 IaC 的爽点。要是哪天不想要了,terraform destroy 一键全清,干干净净。
Terraform 搭骨架,Ansible 填血肉
很多人搞混 Terraform 和 Ansible,其实它俩是"分工不同、最佳拍档"。一句话总结:Terraform 负责"把机器造出来",Ansible 负责"把机器调教好"。
- Terraform(声明式、管资源):擅长创建/销毁云资源——服务器、网络、数据库、负载均衡。它信奉不可变基础设施:要更新?直接销毁旧的、建个新的,而不是在旧机器上修修补补,这样最不容易出幺蛾子。
- Ansible(过程式、管配置):擅长在已经存在的机器上装软件、改配置、启服务。它无代理(agentless),靠 SSH 连上去,用 YAML 写一本叫 Playbook 的"剧本"。它更适合"打补丁、改防火墙"这类 Day-2 运维活儿。
- name: 给 web 服务器装 Nginxhosts: web_serversbecome: yestasks:- name: 安装 Nginx 包yum: { name: nginx, state: present }- name: 启动 Nginx 服务service: { name: nginx, state: started, enabled: yes }
实际项目里,常见套路是:先用 Terraform 把 100 台裸机"啪"地建出来,再让 Ansible 登上去统一装好 Nginx、配好环境变量。一个管"有没有",一个管"对不对",配合起来就是完整的基础设施全生命周期。Ansible 本身 2012 年诞生、2015 年被 Red Hat 收购,至今仍是配置管理领域的事实标准。
GitOps:让 Git 仓库直接"驾驶"云端
说到这里,你可能会问:代码写好了,谁来负责"apply"?每次都人工跑?这就引出了最近几年大火的 GitOps 理念。
GitOps 一句话解释:让 Git 仓库成为"唯一真相源",再由一个躲在集群里的智能代理,持续把"实际状态"往"Git 里写的状态"对齐。这个词是 2017 年 Weaveworks 公司发明的。CNCF(云原生计算基金会)旗下的 OpenGitOps 工作组把它总结成四条原则:声明式、版本化且不可变、自动拉取、持续对账。
它最革命性的地方是把传统 CI/CD 的"推(push)"模式翻成了"拉(pull)"模式。过去流水线跑完,用 kubectl apply 把配置"推"进集群——推完之后集群啥样,流水线就不管了。要是有人手贱跑了 kubectl edit 改了点东西,Git 根本不知道,过几天配置就悄悄漂移了。GitOps 反过来:集群里的代理每隔一两分钟就看看 Git,"咦,实际状态和 Git 不一致?那我给你改回去"。想回滚?直接 git revert 一个提交就行。这叫"自愈",也是 GitOps 的精髓。
实现 GitOps 的两大主力工具是 ArgoCD 和 Flux,两者都是 CNCF 毕业级项目。ArgoCD 出身 Intuit,自带一个超好用的网页控制台,能一眼看清"哪些服务同步了、哪些飘了",据 2025 年 CNCF 调查,约六成 Kubernetes 集群用它做应用发布;Flux 更"云原生原教旨",没有花哨界面,全用 Kubernetes 自带的资源对象表达,还能自动把新镜像版本写回 Git。简单说:想要可视化的团队选 ArgoCD,想要极致代码化的平台工程团队选 Flux。
把整条链路串起来看:Terraform 负责把 Kubernetes 集群"生"出来,GitOps(ArgoCD/Flux)负责把应用持续、安全地"喂"进集群。从敲代码到千台机器上线,全程几乎不需要人工登录服务器。
总结:IaC 到底改变了什么
回到开头那个凌晨两点的场景。有了 IaC 和 GitOps,本该是这样:你改一下 .tf 文件,提个 Pull Request,同事 review 通过,流水线自动 plan、apply,100 台机器按你写的说明书整齐地建好,Git 里还留着完整的变更记录。你再也不用 SSH 上去手敲命令,再也不会因为手抖删库,再也不怕"我的机器和你的机器不一样"。
给小团队和个人的建议:别被"千台机器"吓到,IaC 的价值从第一台机器就开始了。哪怕你只在 RackNerd、CloudCone 这类商家买了一台便宜 VPS,也可以用 Terraform 把它的网络、防火墙、标签用代码管起来——下次换机器,一条命令复刻,比翻笔记靠谱一万倍。记住三件事:基础设施用代码写、代码进 Git 管、变更走流水线跑。做到这三点,你就已经摸到了现代 DevOps 自动化的门把手。
常见问题 FAQ
问:什么是 IaC,为什么不用手动 SSH? 答:IaC(基础设施即代码)用配置文件描述服务器/网络,工具如 Terraform 一键创建、变更、销毁,可版本化、可复查、可重复。手动 SSH 易出错、难回滚、人多了不可控,千台规模必上 IaC。
问:Terraform 能管便宜 VPS 吗? 答:能。多数商家(含一些便宜 VPS)提供 API 或 Terraform provider,可直接在代码里定义实例、防火墙、块存储。小到一两台、大到集群,同一套代码复用在多商家,避免厂商锁定。
问:新手怎么入门? 答:先装 Terraform,写 main.tf 定义一台 VPS + SSH 密钥 + 防火墙,terraform plan/apply 看效果,destroy 回收。配合 Git 管理版本,再逐步加模块、变量与远程状态,循序渐进。