AI与基础设施
概述
讲 AIOps 的时候为什么要讲 基础设施即代码(Infrastructure as Code,简称IaC) 呢?
在企业中,不论是先进的技术也好,还是优秀的思想也罢,终究都是服务于业务,这些业务都是部署在各种基础设施之上,包括 AIOps 本身的应用,所以可以理解 IaC 是 AIOps 实现自动化的基础平台。
在 AIOps 的加持下,IaC 可以变得更聪明,比如:
- 自动识别资源的浪费或瓶颈
- 根据负载预测推荐最优的实例类型
- 在部署失败的时候提供根因分析和修复建议
什么是 基础设施即代码(IaC)
基础设施即代码(Infrastructure as Code,简称 IaC) 就是一种通过代码来定义、管理和部署 IT 基础设施的技术方法。
换句话说就是 把以前“手动点击配置服务器”的过程,变成像写程序一样用“代码”来描述和部署基础设施。
举个例子
过去你可能这样做:
- 登录云平台控制台
- 手动创建 VPC、子网、安全组
- 创建 EC2 实例并安装软件
- 配置负载均衡器和数据库
现在你可以这样写一段代码(比如用 Terraform):
resource "aws_instance" "example" {ami = "ami-0c55b159cbfafe1f0"instance_type = "t2.micro"
}
然后运行:
terraform apply
系统就会自动帮你创建一个 AWS 实例。
IaC 的优势
特性 | 描述 |
---|---|
🔁 可重复 | 每次部署都是一样的结果,避免“在我机器上能跑”的问题 |
📦 可版本化 | 使用 Git 管理基础设施的变更历史 |
🚀 可自动化 | 能与 CI/CD 流程集成,实现一键部署 |
🔄 易于扩展 | 快速复制环境(开发、测试、生产) |
🛠️ 可维护性强 | 修改配置只需改代码,无需手动操作 |
常见组织与工具
类型 | 工具 | 说明 |
---|---|---|
声明式 (Declarative) | Terraform、Kubernetes(YAML)、AWS CloudFormation | 描述目标状态,工具负责实现 |
命令式 (Imperative) | Ansible、SaltStack、Chef、Puppet | 编写具体指令一步步执行 |
容器编排 | Docker Compose、Helm Charts | 定义容器化应用的部署结构 |
云厂商专用 | AWS CDK、Azure Bicep | 结合云平台特性的 IaC 工具 |
用 IaC 可以做什么?
- 通过声明式方式定义和创建基础设施,使管理像编写代码一样,实现自动化。
- 统一管理所有资源,包括之前不是用 IaC 工具创建的资源,可导入统一管理。
- 提供更安全的基础设施变更流程,预列影响范围并确认后执行,保障安全性和准确性。
- 与CICD工具整合,自动化管理流程,快速搭建和标准化环境。
- 提供可复用的模块,促进团队协作和标准化、高效性。
Terraform 简介
Terraform 是 IaC 的一个开源工具,由 HashiCorp 开发,用于安全高效地预配、管理和销毁基础设施资源。
你可以用它来创建服务器、数据库、网络、容器、负载均衡器等资源,而无需在云平台界面点击或写脚本逐一配置。
Terraform 的优势
- 采用 HCL(HashiCorp Configuration Language) 语言,简单易学。
- HCL 是领域特定语言(DSL),更清晰、更简洁的配置体验。
- 可读性强,兼具动态编程特性。
示例
# main.tf# 指定 AWS 提供商
provider "aws" {region = "us-west-2"
}# 创建 EC2 实例
resource "aws_instance" "example" {ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI IDinstance_type = "t2.micro"
}
运行 terraform init
和 terraform apply
,你的 AWS 控制台就会有那台新 EC2 实例。
Terraform 架构
Terraform 执行过程主要包含以下组件:
- Terraform Config:用 HCL 编写的声明式配置,描述希望达到的状态
- Terraform Core:核心编排引擎,处理变更,将 HCL 转为期望基础设施状态
- Terraform Provider:与云厂商交互的插件,负责将 HCL 配置映射为 API 请求
- Terraform State:记录当前基础设施的真实状态,保持配置和实际状态一致
- Provider 版本兼容性:
- 推荐固定 provider 版本号(如
"~> 5.0"
),防止自动升级带来不兼容问题
- 推荐固定 provider 版本号(如
示例:
provider "aws" {version = "~> 5.0"
}
Terraform 的核心命令
基础命令
terraform init
:初始化工作目录,下载 provider 插件等依赖terraform plan
:查看将要执行的操作(不做实际更改)terraform apply
:执行配置,实际部署变更terraform destroy
:销毁所有由 terraform 创建的资源
状态管理
terraform state list
:列出现有状态中的所有资源terraform state show <resource>
:查看资源详情terraform state rm <resource>
:移除状态中的资源(不删除真实资源)terraform state pull/push
:状态同步terraform refresh
:同步实际状态到 stateterraform import <resource> <id>
:将已有资源导入管理
查询与调试
terraform show
:显示状态文件terraform output
:显示 outputs 值terraform graph
:生成依赖图terraform validate
:语法检查
其它常用命令
terraform fmt
:格式化 .tf 文件terraform taint <resource>
:标记为污染让下次 apply 重建terraform workspace
:多环境管理(dev/staging/prod)
Terraform State
Terraform State 是 lifecycle 中必不可少的元素,保存了所有基础设施的元数据。
- 默认文件名 terraform.tfstate,记录实际资源状态。
- apply/change 时自动关联远端的实际对象。
- 每次操作都会更新 state 文件,跟踪资源生命周期。
团队协作建议使用远程 state:
- 远端状态自动同步和加锁,避免多人竞争条件导致损坏。
- 保密性更好,支持权限管理和加密。
OSS(例如阿里云 OSS)配置示例:
terraform {backend "oss" {bucket = "bucket-for-terraform-state"prefix = "path/mystate"key = "version-1.tfstate"region = "cn-beijing"tablestore_endpoint = "https://terraform-remote.cn-hangzhou.ots.aliyuncs.com"tablestore_table = "statelock"}
}
Terraform 项目布局
简单项目推荐四个文件:
- main.tf :主要业务逻辑
- outputs.tf:定义输出
- variables.tf:定义参数
- version.tf :依赖和版本控制
示例:
# main.tf
resource "aws_instance" "my-example" {ami = "ami-xxxxxxx"instance_type = var.instance_type
}
# variables.tf
variable "instance_type" {description = "EC2 实例类型"default = "t2.micro"
}
# outputs.tf
output "public_ip" {value = aws_instance.my-example.public_ip
}
# version.tf
terraform {required_version = ">= 1.6.0"required_providers {aws = {source = "hashicorp/aws"version = "~> 5.0"}random = {source = "hashicorp/random"version = "~> 3.0"}alicloud = {source = "aliyun/alicloud"version = "~> 1.2.0"}}
}
复杂项目推荐模块化布局,如:
main.tf
variables.tf
outputs.tf
modules/├── vpc/│ ├── main.tf ...└── rds/├── main.tf ...
引用模块示例:
module "vpc" {source = "./modules/vpc"cidr_block = "10.0.0.0/16"tags = { Name = "my-vpc" }
}
多环境支持目录结构:
project-root/
├── environments/
│ ├── dev/
│ │ ├── main.tf
│ ├── staging/
│ └── prod/
├── modules/
│ ├── vpc/
│ └── rds/
├── versions.tf
└── backend.tf
Terraform 实战(以阿里云为例)
我们将以模块化+多环境支持方式,示范如何用Terraform在阿里云自动部署:
项目需求
- 创建VPC
- 创建ECS
- 在ECS上安装K8S v1.32.1
- 在K8S部署Nginx:latest
目录结构如下:
terraform-k8s-on-ecs/
├── environments/
│ └── dev/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
├── modules/
│ ├── vpc/
│ ├── ecs/
│ ├── k8s-install/
│ └── k8s-deploy-nginx/
├── versions.tf
└── providers.tf
(具体各模块变量定义、主资源定义、脚本、输出等详见原文,不再赘述)
执行步骤
- 切换到 dev 目录下
cd environments/dev
- 创建 dev workspace
terraform workspace new dev
- 初始化
terraform init
- 预执行
terraform plan
- 部署
terraform apply
总结
综上所述,文章系统阐述了基础设施即代码(IaC)的核心概念、与AIOps的关联及显著优势,并聚焦IaC工具Terraform,深入解析其定义、架构、核心命令、状态管理、项目布局等关键内容,最后通过在阿里云平台部署VPC、ECS、K8S及Nginx的实战案例,完整呈现了Terraform在模块化和多环境支持下的应用流程。
这不仅展现了IaC通过代码化管理基础设施的高效性与规范性,也为实际运维中利用Terraform实现自动化部署提供了清晰的思路与参考。