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 分钟)

浙公网安备 33010602011771号