IaC-基础设施即代码
在云计算和现代运维领域,IaC(Infrastructure as Code,基础设施即代码) 是一个极其核心的概念。
简单来说,IaC 是一种思想和方法论,而 Ansible 则是实现这种思想的具体工具之一。
# 一、 怎么理解 IaC(基础设施即代码)?
传统的运维方式是“手动挡”:
如果需要配置 100 台服务器的设备信息,运维工程师需要登录 100 次系统,手动敲入命令、修改配置文件或在网页 UI 上点来点去。这种方式效率低、易出错,且很难原样复制第二套环境。
而 IaC 则是将运维变成了“自动挡”:
核心思想:用人类可读的、结构化的代码/文本文件(如 YAML、JSON、TF 格式)来定义、声明和配置你的基础设施(服务器、网络设备、数据库、设备信息等)。
# IaC 的三大核心优势:
- 版本控制:既然是代码,你就可以把这些配置文件传到 Git。谁在什么时间修改了哪台设备的参数,一目了然。
- 幂等性(Idempotence):这是 IaC 最重要的特性。意思是无论你执行这段代码 1 次还是 100 次,最终得到的基础设施状态都是完全一样的,不会因为重复执行而导致系统乱套。
- 一致性与复现性:通过同一份脚本,你可以在几分钟内完美克隆出一套一模一样的测试环境或灾备环境。
针对你提到的“IaC 自动化管理设备信息”,实际操作中就是把所有设备的硬件参数、IP 地址、资产编号等写成结构化的代码(比如一个 devices.yaml 文件),然后通过自动化引擎去批量配置或同步这些设备,而不是人工逐台录入。
# 二、 IaC 和 Ansible 有什么区别?
这两者其实不是并列关系,而是“汽车(Ansible)”与“交通规则/驾驶技术(IaC)”的关系。
# 1. 概念定位不同
- IaC(基础设施即代码):是一套指导思想。它告诉你“你应该把基础设施当成代码来管理”。
- Ansible:是一个具体的开源自动化运维工具。它是实现 IaC 思想的利器。
# 2. 广义的 IaC 工具分类(Ansible 的生态位置)
在 IaC 的大家族里,工具通常分为两大流派。理解这个分类,你能更清楚 Ansible 的定位:
| 维度 | 配置管理工具(Configuration Management) | 编排/置备工具(Provisioning) |
|---|---|---|
| 代表工具 | Ansible, SaltStack, Puppet | Terraform, OpenStack, CloudFormation |
| 核心职责 | 负责在已存在的服务器/设备上安装软件、修改配置、管理设备信息(操作系统内部的治理)。 | 负责从无到有地创建基础设施,如向云厂商申请 10 台虚拟机、划分 VPC 网络。 |
| 工作特点 | 擅长“针对现有的设备,把它们改造成我想要的样子”。 | 擅长“从零开始建房子”。 |
一句话总结:通常我们用 Terraform 去云厂商那里一键买下 10 台服务器(置备阶段),然后用 Ansible 登录这 10 台服务器去批量配置设备信息、安装环境(配置管理阶段)。两者都是 IaC 的体现。
# 三、IaC常见方案
一个标准的、现代化的 IaC 具体实现方案,通常会经历 置备(Provisioning)—>配置管理(Configuration) —> 应用部署(Deployment) 三个阶段。
以下是目前企业中最主流的 4 种 IaC 具体实现方案及技术栈组合:
# 方案一:Terraform + Ansible 组合(最经典的现代混搭风)
这是目前业界最流行、最推荐的黄金组合。它完美地实现了“专业的人做专业的事”。
- 实现逻辑:
- Terraform(负责“建房子”):运维人员编写
.tf代码,Terraform 调用各大云厂商(阿里云、AWS、腾讯云等)的 API,一键批量创建出 VPC 网络、安全组、负载均衡(SLB)和 50 台虚拟机(ECS)。 - Ansible(负责“精装修”):服务器创建好后,Terraform 把这些服务器的 IP 地址传给 Ansible。Ansible 通过 SSH 登录这 50 台机器,批量安装 Java 环境、配置安全策略、优化内核参数。
- Terraform(负责“建房子”):运维人员编写
- 适用场景:多云环境(混合云/公有云)、传统虚机架构、需要频繁扩缩容的基础设施。
# 方案二:GitOps 声明式方案:ArgoCD + Kubernetes(云原生首选)
在全量容器化的时代,Kubernetes(K8s)本身就是一个巨大的 IaC 引擎。而 GitOps 是云原生下 IaC 的终极演进形态。
- 实现逻辑:
- 所有的基础设施(K8s 的 Deployment、Service、Ingress 等)全部用 YAML 或 Helm Chart 编写,并保存在 Git 仓库中。Git 仓库成为了基础设施的唯一真理源(Source of Truth)。
- 在 K8s 集群内部署 ArgoCD 或 Flux。
- ArgoCD 会死死盯着 Git 仓库。一旦开发或运维修改了 Git 里的 YAML 文件(比如把副本数从 3 改成 5),ArgoCD 就会自动感应,并把 K8s 集群的状态自动拉平到代码定义的状态。
- 适用场景:微服务架构、Kubernetes 环境、追求高度自动化和持续部署(CD)的团队。
# 方案三:云厂商原生方案(Cloud-Specific IaC)
如果你所有的业务都深度绑定在某一家云厂商上,不想折腾第三方工具,直接用云厂商自带的 IaC 服务是最省心的。
- 实现逻辑:
- AWS CloudFormation / 阿里云 ROS(资源编排) / 腾讯云 TIC。
- 你只需要编写标准的 JSON 或 YAML 模板,描述你需要的云资源,然后把模板提交给云控制台。云厂商在后台会帮你处理依赖关系、创建资源,并提供图形化的堆栈管理。
- 适用场景:单一云厂商环境,团队不想维护复杂的开源 IaC 工具(如 Terraform 的 State 文件)。
# 方案四:不可变基础设施方案:Packer + Image(镜像即代码)
传统的 IaC 是在服务器建好后去改配置(可变基础设施)。而这个方案走的是极端路线:服务器一旦创建就绝不修改,要改就直接换新的(不可变基础设施)。
- 实现逻辑:
- 使用 Packer 编写代码,定义一个标准的系统镜像。代码里写明:基于 Ubuntu,安装好 Nginx,配置好安全审计软件。
- Packer 自动在后台跑一遍,吐出一个固定的 AMI/VHD 虚拟机镜像。
- 当需要部署或更新时,直接用这个新镜像去创建/替换服务器。
- 适用场景:对安全性、一致性要求极高的金融、电商核心系统;配合 autoscaling(自动弹性伸缩)使用。
# 总结
IaC算是 自动化运维的一个核心思想,它很广泛,在现代自动化运维架构中:
- 基础镜像(如 Ubuntu) 是环境标准化的原材料。
- Dockerfile / Packer 脚本 是定义环境的代码(IaC)。
- Harbor / 阿里云 ACR 是分发这些标准化镜像的集散地。
这些都是IaC的范畴。