Terraform 了解一下

声明:

由AI提供的相关知识,如有侵权,请找AI维权,知识有价,开源无价。

相关URL

1. terraform官网

https://developer.hashicorp.com/terraform

2. terraform下载地址

https://releases.hashicorp.com/terraform

Linux安装terraform

登录下载地址,下载一个zip包,解压安装

[root@10-20-22-41 yun]# unzip -l terraform_1.14.0_linux_amd64.zip
Archive:  terraform_1.14.0_linux_amd64.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     4922  11-19-2025 21:25   LICENSE.txt
100507832  11-19-2025 21:25   terraform
---------                     -------
100512754                     2 files
[root@10-20-22-41 yun]# unzip terraform_1.14.0_linux_amd64.zip
Archive:  terraform_1.14.0_linux_amd64.zip
  inflating: LICENSE.txt
  inflating: terraform
[root@10-20-22-41 yun]# install terraform -m 755 /usr/local/bin/
[root@10-20-22-41 yun]# which terraform
/usr/local/bin/terraform
[root@10-20-22-41 yun]# terraform --version
Terraform v1.14.0
on linux_amd64

windows安装terraform

1. 解压terraform_1.14.0_windows_amd64.zip 安装包,重命名文件夹terraform,将文件夹剪切到D盘

2. 设置环境变量,在系统变量 -- Path 中新增一条 D:\terraform

3. 打开CMD,执行验证

C:\Users\Admin>terraform --version
Terraform v1.14.0
on windows_amd64

通过terraform连接到公有云条件

1. 云厂商CLI(Command Line Interface):阿里云、腾讯云、华为云、AWS、Azure(不需要python)、Google

2. 版本控制工具:git

3. Python 3.11

4. 公有云控制台创建账户和秘钥

配置连接云厂商provider

Terraform 配置文件(.tf)中,Provider 配置需放在资源定义之前(Terraform 会先加载 Provider)

# 声明需要的阿里云 Provider 版本(固定写法,选稳定版本)
terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"  # Provider 来源,阿里云官方
      version = "~> 1.203.0"       # 推荐稳定版本,可兼容大部分资源
    }
  }
}

# 配置阿里云 Provider 核心信息(必填)
provider "alicloud" {
  # 阿里云 Access Key ID(替换为你的实际值)
  access_key = "你的AccessKey ID"
  # 阿里云 Access Key Secret(替换为你的实际值)
  secret_key = "你的AccessKey Secret"
  # 地域(如杭州:cn-hangzhou,上海:cn-shanghai,必填)
  region     = "cn-hangzhou"
}

# 不要直接把 access_key 和 secret_key 写在代码里!生产环境推荐用 环境变量 或 凭证文件
# 方式1:读取环境变量(推荐)
provider "alicloud" {
  access_key = var.access_key  # 从变量读取,变量值可通过环境变量 TF_VAR_access_key 传入
  secret_key = var.secret_key
  region     = "cn-hangzhou"
}

Terraform 配置文件的核心基础

terraform配置文件格式是HCL(HashiCorp Configuration Language),文件后缀.tf

terraform 会读取同一个目录下所有的 .tf 文件(无论文件名是什么),并将它们作为一个整体配置来解析。

一个完整的 Terraform 配置,通常包含 5 个核心模块(块结构)

1. terraform块(全局配置)

声明 Terraform 的全局配置,核心是指定所需的 Provider 版本(避免版本兼容问题),也可配置后端存储

terraform {
    required_providers {
      alicloud = {
        source = "aliyun/cloud"
        version = "~> 1.203.0"
      }
    }
}

2. provider块(云厂商连接配置块)

配置对应云厂商的连接信息,让 Terraform 能够成功连接到云厂商平台(如阿里云、AWS),核心是填写 API 凭证、地域等信息。

provider "alicloud" {
  access_key = var.access_key
  secret_key = var.secret_key
  region = "cn-hangzhou"
}

3. resource 块(资源定义块,核心)

定义要在云厂商上创建、修改或删除的具体资源,这是 Terraform 配置的核心(最终要创建的 ECS、EC2、VPC 都在这里定义)。

语法格式:resource "资源类型" "资源名称" { 资源配置参数 }

  • 资源类型:云厂商定义的资源标识(如阿里云 ECS 是 alicloud_instance,AWS EC2 是 aws_instance)。
  • 资源名称:自定义名称(用于在配置中引用该资源,如 my_ecs)。
resource "alicloud_instance" "my_ecs" {
  instance_type = "ecs.t5-lc2m1.nano"  # ECS 规格
  image_id = = "centos_7_9_x64_20G_alibase_20240105.vhd"  # 操作系统镜像
  instance_name = "MY_ECS" # ECS 名称
  allocate_public_ip = true # 分配公网 IP
}

4. variable 块(变量定义块)

定义可复用的变量,用于替换配置中的硬编码值(如 Access Key、实例名称),让配置更灵活、可复用。

引用方式:使用 ${var.变量名} 或直接 var.变量名 引用

variable "access_key" {
  description = "阿里云 access key"
  type = string
}

variable "secret_key" {
  description = "阿里云 secret key"
  type = string
  default = "设置一个默认值,传空使用"
}

5. output块(输出结果块)

定义 Terraform 执行 apply 后,需要主动展示的结果信息(如 ECS 公网 IP、资源 ID),方便获取关键资源信息。

# 输出ECS公网IP
output "ecs_public_ip" {
  description = "阿里云ECS实例公网IP地址"
  value = alicloud_instance.my_ecs.public_ip
}

辅助配置文件

文件名 用途
provider.tf 单独存放 terraform 块和 provider 块,分离云厂商配置和资源配置,更清晰
variables.tf 集中存放所有 variable 块,方便统一管理和修改变量
outputs.tf 集中存放所有 output 块,统一管理输出结果
terraform.tfvars 存放变量的具体取值(如 Access Key、地域),无需在命令行手动传入,安全且便捷

 

 

 

 

 

 

 

 

 

语法基础

1. 注释 

# 单行

/* 注释内容 */  多行

2. 块结构  块名称 { 块内容 } 

3. 键值对 配置参数采用 key = value 格式 (等号两侧必须有空格)

4. 引用变量 var.变量名

    引用其他资源属性  资源类型.资源名称.属性名 

5. 数据类型

string

number

bool

配置文件执行逻辑

初始化: terraform init,读取所有 .tf 文件中的 terraform 块,下载对应的 Provider 插件

计划: terraform plan,读取所有 .tf 文件的完整配置,验证语法正确性,生成资源创建计划

应用: terraform apply,按照计划创建 / 修改资源,执行完成后,输出 output 块定义的结果

销毁:terraform destroy,销毁所有创建的资源,停止产生费用

 实战案例1:创建一个阿里云的ECS实例

一、说明

1. 目标:创建一台阿里云 ECS 实例(含配套 VPC、交换机、安全组,满足 ECS 运行条件)

2. 配置文件:采用「拆分文件」的方式(更规范,贴近实际项目),共 5 个文件

3. 前置条件:已准备阿里云账号、AccessKey(ID/Secret)、安装 Terraform、安装阿里云CLI

二、创建配置文件

1. provides.tf

# Terraform 全局配置:声明阿里云 Provider 版本
terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"
      version = "~> 1.203.0" # 稳定版本,兼容大部分阿里云资源
    }
  }
}

# 阿里云 Provider 核心配置:连接云厂商
provider "alicloud" {
  access_key = var.alicloud_access_key # 引用变量(从 tfvars 文件读取)
  secret_key = var.alicloud_secret_key # 引用变量(从 tfvars 文件读取)
  region     = var.alicloud_region     # 引用变量(地域,默认杭州)
}

2. variables.tf

# 阿里云 AccessKey ID
variable "alicloud_access_key" {
  description = "阿里云账号的 AccessKey ID"
  type        = string
  sensitive   = true # 标记为敏感信息,执行 plan/apply 时不明文显示
}

# 阿里云 AccessKey Secret
variable "alicloud_secret_key" {
  description = "阿里云账号的 AccessKey Secret"
  type        = string
  sensitive   = true # 敏感信息,隐藏输出
}

# 阿里云地域
variable "alicloud_region" {
  description = "阿里云资源部署的地域"
  type        = string
  default     = "cn-hangzhou" # 默认杭州地域,稳定可用
}

# ECS 实例名称
variable "ecs_instance_name" {
  description = "ECS 实例的自定义名称"
  type        = string
  default     = "terraform-complete-demo-ecs"
}

# ECS 登录密码
variable "ecs_login_password" {
  description = "ECS 实例的 root 登录密码(需符合阿里云规则:8位以上,大小写+数字+特殊符号)"
  type        = string
  sensitive   = true
}

3. resources.tf (核心资源)

# 1. 创建虚拟私有云(VPC):ECS 必须依赖的网络环境
resource "alicloud_vpc" "demo_vpc" {
  vpc_name   = "${var.ecs_instance_name}-vpc" # 拼接变量,生成唯一名称
  cidr_block = "172.16.0.0/16"                # 网段,新手保持默认
}

# 2. 创建虚拟交换机(VSwitch):VPC 内的子网,分配给 ECS
resource "alicloud_vswitch" "demo_vswitch" {
  vswitch_name = "${var.ecs_instance_name}-vswitch"
  vpc_id       = alicloud_vpc.demo_vpc.id # 引用上面创建的 VPC ID
  cidr_block   = "172.16.1.0/24"          # 子网网段,在 VPC 网段内
  zone_id      = "${var.alicloud_region}-h" # 可用区,与地域匹配
}

# 3. 创建安全组:开放 22 端口(SSH 登录)、80 端口(网页测试)
resource "alicloud_security_group" "demo_security_group" {
  name        = "${var.ecs_instance_name}-security-group"
  description = "为新手 demo 开放 22/80 端口"
  vpc_id      = alicloud_vpc.demo_vpc.id # 关联 VPC
}

# 4. 安全组规则:允许外部访问 22 端口(SSH 登录)
resource "alicloud_security_group_rule" "allow_ssh" {
  type              = "ingress" # 入方向(外部访问 ECS)
  ip_protocol       = "tcp"
  port_range        = "22/22"
  security_group_id = alicloud_security_group.demo_security_group.id
  cidr_ip           = "0.0.0.0/0" # 允许所有 IP 访问(测试环境可用)
}

# 5. 安全组规则:允许外部访问 80 端口(HTTP 网页)
resource "alicloud_security_group_rule" "allow_http" {
  type              = "ingress"
  ip_protocol       = "tcp"
  port_range        = "80/80"
  security_group_id = alicloud_security_group.demo_security_group.id
  cidr_ip           = "0.0.0.0/0"
}

# 6. 核心:创建阿里云 ECS 实例
resource "alicloud_instance" "demo_ecs" {
  # 基础配置(新手保持默认,免费额度内)
  instance_type          = "ecs.t5-lc2m1.nano"
  image_id               = "centos_7_9_x64_20G_alibase_20240105.vhd"
  instance_name          = var.ecs_instance_name
  description            = "Terraform 完整案例创建的 ECS 实例"
  availability_zone      = "${var.alicloud_region}-h"
  security_groups        = [alicloud_security_group.demo_security_group.id]
  vswitch_id             = alicloud_vswitch.demo_vswitch.id

  # 计费与网络配置
  instance_charge_type   = "PostPaid" # 按量付费,不用可销毁,避免扣费
  internet_charge_type   = "PayByTraffic" # 按流量计费
  internet_max_bandwidth_out = 1 # 1M 带宽,足够测试
  allocate_public_ip     = true # 分配公网 IP,方便远程登录验证

  # 系统盘与登录配置
  system_disk_category   = "cloud_efficiency"
  system_disk_size       = 20
  password               = var.ecs_login_password # 引用登录密码变量
}

4. outputs.tf

# 输出 ECS 实例公网 IP(核心,用于后续验证登录)
output "ecs_public_ip" {
  description = "阿里云 ECS 实例的公网 IP 地址(用于 SSH 登录和网页测试)"
  value       = alicloud_instance.demo_ecs.public_ip
}

# 输出 ECS 实例 ID(可选,用于阿里云控制台查询)
output "ecs_instance_id" {
  description = "阿里云 ECS 实例的唯一 ID"
  value       = alicloud_instance.demo_ecs.id
}

# 输出 VPC ID(可选,展示配套资源结果)
output "vpc_id" {
  description = "创建的 VPC 实例 ID"
  value       = alicloud_vpc.demo_vpc.id
}

5. terraform.tfvars

# 【必填修改 1】替换为你的阿里云 AccessKey ID
alicloud_access_key = "你的阿里云 AccessKey ID"

# 【必填修改 2】替换为你的阿里云 AccessKey Secret
alicloud_secret_key = "你的阿里云 AccessKey Secret"

# 【必填修改 3】替换为符合阿里云规则的 ECS 登录密码(例:Terraform123!)
ecs_login_password = "YourValidPassword123!"

# 可选:修改 ECS 实例名称(保持默认也可)
# ecs_instance_name = "my-terraform-demo-ecs"

 三、执行流程

1. 切换到案例文件夹

2. 初始化(下载阿里云 Provider 插件),执行命令 terraform init

3. 生成计划, 执行命令 terraform plan

4. 应用配置, 执行命令 terraform apply

  • 命令行会先重复展示计划内容,最后提示 Enter a value:
  • 输入 yes 并回车(确认创建资源,这一步会实际消耗阿里云资源,可能产生少量费用)
  • 等待执行完成(约 1-3 分钟,不要关闭命令行

5. 验证部署结果,登录阿里云管理平台,或者直接ssh连接

6. 如果不使用,即时销毁,避免浪费成本,执行命令 terraform destroy

 实战案例2:创建一个AWS的EC2实例

一、说明

1. 目标:创建一台 AWS EC2 实例(含配套 VPC、子网、安全组,满足 EC2 运行的基础网络条件)

2. 配置文件:采用「拆分文件」的方式(更规范,贴近实际项目),共 5 个文件

3. 前置条件:已准备AWS账号、AccessKey(ID/Secret)、安装 Terraform、安装AWS CLI

4. 注意:AWS EC2 不支持密码登录,必须使用密钥对,需提前在 AWS 控制台创建

二、创建配置文件

1. provides.tf

# Terraform 全局配置:声明 AWS Provider 版本
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"  # AWS 官方 Provider(固定来源)
      version = "~> 5.0"         # 稳定版本,兼容大部分 AWS 资源
    }
  }
}

# AWS Provider 核心配置:连接 AWS 云平台
provider "aws" {
  access_key = var.aws_access_key_id     # 引用变量(从 tfvars 文件读取)
  secret_key = var.aws_secret_access_key # 引用变量(从 tfvars 文件读取)
  region     = var.aws_region            # 引用变量(默认美国东部区域,稳定可用)
}

2. variables.tf

# AWS Access Key ID
variable "aws_access_key_id" {
  description = "AWS 账号的 Access Key ID(从 IAM 控制台获取)"
  type        = string
  sensitive   = true # 标记为敏感信息,执行 plan/apply 时不明文显示
}

# AWS Secret Access Key
variable "aws_secret_access_key" {
  description = "AWS 账号的 Secret Access Key(从 IAM 控制台获取)"
  type        = string
  sensitive   = true # 敏感信息,隐藏输出,避免泄露
}

# AWS 地域
variable "aws_region" {
  description = "AWS 资源部署的地域"
  type        = string
  default     = "us-east-1" # 默认 us-east-1(美国东部弗吉尼亚),资源最丰富
}

# EC2 实例名称
variable "ec2_instance_name" {
  description = "EC2 实例的自定义名称"
  type        = string
  default     = "terraform-aws-demo-ec2"
}

# EC2 登录密钥对名称(AWS 登录无需密码,使用密钥对)
variable "ec2_key_pair_name" {
  description = "AWS 控制台创建的密钥对名称(用于 SSH 登录 EC2)"
  type        = string
}

3. resources.tf

# 1. 创建虚拟私有云(VPC):EC2 必须依赖的网络环境
resource "aws_vpc" "demo_vpc" {
  cidr_block           = "10.0.0.0/16"  # 网段,新手保持默认
  enable_dns_support   = true            # 启用 DNS 支持
  enable_dns_hostnames = true            # 启用 DNS 主机名(让 EC2 分配公有 DNS)

  # 给 VPC 打标签,方便 AWS 控制台查询
  tags = {
    Name = "${var.ec2_instance_name}-vpc"
  }
}

# 2. 创建公有子网(Subnet):VPC 内的子网,分配给 EC2(用于访问公网)
resource "aws_subnet" "demo_subnet" {
  vpc_id            = aws_vpc.demo_vpc.id  # 引用上面创建的 VPC ID
  cidr_block        = "10.0.1.0/24"        # 子网网段,在 VPC 网段内
  availability_zone = "${var.aws_region}a" # 可用区,与地域匹配(us-east-1a)
  map_public_ip_on_launch = true           # 自动分配公有 IP 给子网内的 EC2

  # 给子网打标签
  tags = {
    Name = "${var.ec2_instance_name}-subnet"
  }
}

# 3. 创建 Internet Gateway(IGW):让 VPC 内的资源访问公网
resource "aws_internet_gateway" "demo_igw" {
  vpc_id = aws_vpc.demo_vpc.id

  tags = {
    Name = "${var.ec2_instance_name}-igw"
  }
}

# 4. 创建路由表:配置子网的公网路由(指向 IGW)
resource "aws_route_table" "demo_route_table" {
  vpc_id = aws_vpc.demo_vpc.id

  # 添加公网路由规则:所有外网流量指向 IGW
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.demo_igw.id
  }

  tags = {
    Name = "${var.ec2_instance_name}-route-table"
  }
}

# 5. 关联路由表与子网:让子网获得公网访问能力
resource "aws_route_table_association" "demo_route_association" {
  subnet_id      = aws_subnet.demo_subnet.id
  route_table_id = aws_route_table.demo_route_table.id
}

# 6. 创建安全组:开放 22 端口(SSH 登录)、80 端口(网页测试)
resource "aws_security_group" "demo_security_group" {
  name        = "${var.ec2_instance_name}-security-group"
  description = "为新手 demo 开放 22/80 端口,允许公网访问"
  vpc_id      = aws_vpc.demo_vpc.id

  # 入方向规则:允许所有 IP 访问 22 端口(SSH 登录)
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  # 入方向规则:允许所有 IP 访问 80 端口(HTTP 网页)
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  # 出方向规则:允许 EC2 访问公网(如下载软件)
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"  # -1 表示所有协议
    cidr_blocks = ["0.0.0.0/0"]
  }

  # 给安全组打标签
  tags = {
    Name = "${var.ec2_instance_name}-security-group"
  }
}

# 7. 核心:创建 AWS EC2 实例
resource "aws_instance" "demo_ec2" {
  # 基础配置(新手保持默认,免费额度内支持)
  ami           = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 镜像(us-east-1 地域专用,稳定)
  instance_type = "t2.micro"              # 免费额度支持的实例规格
  key_name      = var.ec2_key_pair_name   # 引用密钥对名称(用于 SSH 登录)

  # 网络配置
  subnet_id     = aws_subnet.demo_subnet.id
  vpc_security_group_ids = [aws_security_group.demo_security_group.id]

  # 标签配置(实例名称)
  tags = {
    Name = var.ec2_instance_name
  }
}

4. outputs.tf

# 输出 EC2 实例公网 IP(核心,用于 SSH 登录和网页测试)
output "ec2_public_ip" {
  description = "AWS EC2 实例的公网 IP 地址(用于 SSH 登录和网页测试)"
  value       = aws_instance.demo_ec2.public_ip
}

# 输出 EC2 实例 ID(可选,用于 AWS 控制台查询)
output "ec2_instance_id" {
  description = "AWS EC2 实例的唯一 ID"
  value       = aws_instance.demo_ec2.id
}

# 输出 VPC ID(可选,展示配套资源结果)
output "vpc_id" {
  description = "创建的 VPC 实例 ID"
  value       = aws_vpc.demo_vpc.id
}

5. terraform.tfvars

# 【必填修改 1】替换为你的 AWS Access Key ID
aws_access_key_id = "你的 AWS Access Key ID"

# 【必填修改 2】替换为你的 AWS Secret Access Key
aws_secret_access_key = "你的 AWS Secret Access Key"

# 【必填修改 3】替换为你的 AWS 控制台创建的密钥对名称(提前在 us-east-1 地域创建)
ec2_key_pair_name = "你的 AWS 密钥对名称"

# 可选:修改 EC2 实例名称(保持默认也可)
# ec2_instance_name = "my-aws-terraform-demo-ec2"

# 可选:修改地域(需同步更换 EC2 镜像 AMI,新手不推荐)
# aws_region = "ap-southeast-1"

三、执行流程

1. 切换到案例文件夹

2. 初始化(下载AWS Provider 插件),执行命令 terraform init

3. 生成计划, 执行命令 terraform plan

4. 应用配置, 执行命令 terraform apply

  • 命令行会先重复展示计划内容,最后提示 Enter a value:
  • 输入 yes 并回车(确认创建资源,这一步会实际消耗阿里云资源,可能产生少量费用)
  • 等待执行完成(约 1-3 分钟,不要关闭命令行

5. 验证部署结果,登录阿里云管理平台,或者直接ssh连接,linux 连接ssh需要使用如下操作

  • 进入密钥文件存放目录,修改权限(避免 AWS 拒绝登录) chmod 400 你的密钥文件名.pem
  • ssh -i ~/Downloads/your-key-pair.pem ec2-user@3.14.xxx.xxx。说明:ec2-user 是 Amazon Linux 2 镜像的默认登录用户名,不可修改。

6. 如果不使用,即时销毁,避免浪费成本,执行命令 terraform destroy

  • 命令行展示要销毁的资源列表,最后提示 Enter a value:
  • 输入 yes 并回车,等待销毁完成(约 1-2 分钟)
posted @ 2026-01-15 09:34  威尔逊不背锅  阅读(0)  评论(0)    收藏  举报