2222036-20220402155502615-1563973416.png#Terraform 介绍
Terraform 是 HashiCorp 公司开发的开源 基础设施即代码(Infrastructure as Code, IaC) 工具,通过声明式语法实现多云、混合云和本地资源的自动化管理。它允许用户用代码定义基础设施(如云服务器、网络、数据库等),并通过版本控制、协作和自动化流程实现资源的创建、更新和销毁。

核心原理

Terraform 的核心原理基于 声明式配置 和 资源状态管理,通过以下机制实现自动化:

  1. 声明式语法(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 自动完成具体操作。

  2. 状态文件(State File)

    • terraform.tfstate:

    JSON 格式文件,记录当前基础设施的实际状态(如资源 ID、属性、依赖关系)。
    作用:
    对比代码与真实环境的差异,确定需要执行的操作(增、删、改)。
    支持团队协作(通过远程状态存储,如阿里云 OSS、AWS S3)。

    • 状态同步机制:

    每次执行 terraform apply 后更新状态文件,确保与实际资源一致。

  3. 资源图(Dependency Graph)

    • 依赖分析:

    Terraform 解析代码中的显式/隐式依赖关系(例如 vswitch_id = alicloud_vswitch.main.id),生成资源执行顺序图。

    • 并发操作:

    无依赖的资源可并行创建,提升效率。

  4. 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 实例。

  1. 执行计划(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 已删除。