#Terraform 介绍
Terraform 是 HashiCorp 公司开发的开源 基础设施即代码(Infrastructure as Code, IaC) 工具,通过声明式语法实现多云、混合云和本地资源的自动化管理。它允许用户用代码定义基础设施(如云服务器、网络、数据库等),并通过版本控制、协作和自动化流程实现资源的创建、更新和销毁。
核心原理
Terraform 的核心原理基于 声明式配置 和 资源状态管理,通过以下机制实现自动化:
声明式语法(HCL)
- HCL(HashiCorp Configuration Language):
Terraform 使用易于阅读的配置语言(类似 JSON 或 YAML)描述基础设施的目标状态。
resource "alicloud_instance" "web" { instance_type = "ecs.t5-lc1m2.small" image_id = "ubuntu_22_04_x64_20G_alibase_20230718.vhd" }
- 目标状态(Desired State):
用户只需定义“需要什么资源”,而无需指定“如何创建”,Terraform 自动完成具体操作。
状态文件(State File)
- terraform.tfstate:
JSON 格式文件,记录当前基础设施的实际状态(如资源 ID、属性、依赖关系)。
作用:
对比代码与真实环境的差异,确定需要执行的操作(增、删、改)。
支持团队协作(通过远程状态存储,如阿里云 OSS、AWS S3)。- 状态同步机制:
每次执行 terraform apply 后更新状态文件,确保与实际资源一致。
资源图(Dependency Graph)
- 依赖分析:
Terraform 解析代码中的显式/隐式依赖关系(例如 vswitch_id = alicloud_vswitch.main.id),生成资源执行顺序图。
- 并发操作:
无依赖的资源可并行创建,提升效率。
Provider 机制
- Provider:
插件化的驱动模块,对接不同云平台(如阿里云、AWS)或服务(如 Kubernetes、MySQL)。
工作原理:
将 HCL 代码转换为云服务商 API 请求(如阿里云的 CreateInstance)。
管理资源的生命周期(增删改查)。- 示例:阿里云 Provider 调用流程:
provider "alicloud" {
region = "cn-hangzhou"
access_key = "AKID"
secret_key = "SECRET"
}
resource "alicloud_instance" "web" { ... }
执行时,Terraform 通过阿里云 SDK 调用对应 API 创建 ECS 实例。
执行计划(Plan)与幂等性
- terraform plan:
生成执行计划,显示将要执行的操作(如 + create、- delete),但不实际修改资源。
- 幂等性(Idempotency):
多次执行同一配置结果一致,避免重复创建资源或配置漂移。
从零开始使用Terraform(创建ECS和RDS,最后将全部删除)
1. 安装 Terraform
# 下载并解压 Terraform(以 Linux 为例)
wget https://releases.hashicorp.com/terraform/1.5.7/terraform_1.5.7_linux_amd64.zip
unzip terraform_1.5.7_linux_amd64.zip
sudo mv terraform /usr/local/bin/
terraform version # 验证安装
2. 配置阿里云凭证
# 通过环境变量设置 AccessKey 和 SecretKey
export ALICLOUD_ACCESS_KEY="YOUR_ACCESS_KEY"
export ALICLOUD_SECRET_KEY="YOUR_SECRET_KEY"
export ALICLOUD_REGION="cn-hangzhou" # 设置地域
3. 编写 Terraform 代码
创建项目目录
mkdir alicloud-demo && cd alicloud-demo
4. 编写基础设施代码文件
创建以下文件:
- provider.tf:配置阿里云 Provider
- vpc.tf:定义 VPC 和 VSwitch
- ecs.tf:定义 ECS 实例
- rds.tf:定义 RDS 数据库
- variables.tf:定义变量
- outputs.tf:输出资源信息
5. 文件内容示例:
(1)provider.tf
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.209"
}
}
}
provider "alicloud" {
region = var.region
}
(2)vpc.tf
# 创建 VPC
resource "alicloud_vpc" "demo_vpc" {
vpc_name = "demo-vpc"
cidr_block = "10.0.0.0/16"
}
# 创建 VSwitch
resource "alicloud_vswitch" "demo_vswitch" {
vpc_id = alicloud_vpc.demo_vpc.id
cidr_block = "10.0.1.0/24"
zone_id = "cn-hangzhou-a"
}
(3)ecs.tf
# 创建安全组
resource "alicloud_security_group" "demo_sg" {
vpc_id = alicloud_vpc.demo_vpc.id
}
# 创建 ECS 实例
resource "alicloud_instance" "demo_ecs" {
instance_type = "ecs.t5-lc1m2.small"
image_id = "ubuntu_22_04_x64_20G_alibase_20230718.vhd" # Ubuntu 22.04 镜像
vswitch_id = alicloud_vswitch.demo_vswitch.id
security_groups = [alicloud_security_group.demo_sg.id]
system_disk_category = "cloud_efficiency"
tags = {
Name = "Demo-ECS"
}
}
(4)rds.tf
# 创建 RDS 实例
resource "alicloud_db_instance" "demo_rds" {
engine = "MySQL"
engine_version = "8.0"
instance_type = "rds.mysql.s2.large"
instance_storage = "20"
vswitch_id = alicloud_vswitch.demo_vswitch.id
security_ips = ["10.0.1.0/24"]
}
(5)variables.tf
variable "region" {
description = "阿里云地域"
default = "cn-hangzhou"
}
(6)outputs.tf
output "ecs_public_ip" {
value = alicloud_instance.demo_ecs.public_ip
}
output "rds_connection_string" {
value = alicloud_db_instance.demo_rds.connection_string
}
初始化Terraform
terraform init
预览执行计划
terraform plan
检查输出中是否包含以下资源:
- alicloud_vpc.demo_vpc
- alicloud_vswitch.demo_vswitch
- alicloud_security_group.demo_sg
- alicloud_instance.demo_ecs
- alicloud_db_instance.demo_rds
应用变更
terraform apply -auto-approve
等待约 5-10 分钟(RDS 创建较慢),输出结果示例如下:
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
Outputs:
ecs_public_ip = "47.96.xxx.xxx"
rds_connection_string = "rm-uf6xxxxxxx.mysql.rds.aliyuncs.com"
验证资源
登录阿里云控制台
- 进入 ECS 控制台,查看名为 Demo-ECS 的实例。
- 进入 RDS 控制台,查看创建的 MySQL 实例。
通过 SSH 连接 ECS
ssh root@${ecs_public_ip} # 密码需通过控制台重置获取
销毁所有资源
执行销毁命令
terraform destroy -auto-approve
确认输出中所有资源将被删除:
Destroy complete! Resources: 5 destroyed.
验证资源已删除
- 检查 ECS 和 RDS 控制台,确认实例已消失。
- 检查 VPC 控制台,确认 VPC 和 VSwitch 已删除。