2. Terraform 基础回顾:Provider配置、资源声明、变量与输出、状态文件管理
在深入弹性伸缩任务编排之前,必须夯实 Terraform 的核心基础。本章将围绕四个关键支柱展开:Provider 配置(与云平台建立连接)、资源声明(定义基础设施对象)、变量与输出(实现参数化与数据传递)、状态文件管理(维护基础设施的实时映射)。
学习目标: 完成本章后,你将能够独立编写一个包含变量、资源、输出的完整 Terraform 配置文件,并理解状态文件在团队协作中的重要性。
2.1 Provider 配置:连接云平台
Provider 是 Terraform 与目标 API(如 AWS、Azure、阿里云)交互的桥梁。每个 Provider 都需要声明 required_providers 并配置认证信息。
# 声明阿里云 Provider
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.200.0"
}
}
}
# 配置 Provider 实例
provider "alicloud" {
region = "cn-hangzhou"
# 认证方式:环境变量 / 配置文件 / 显式指定
access_key = var.alicloud_access_key
secret_key = var.alicloud_secret_key
}
| 配置项 | 说明 | 推荐做法 |
|---|---|---|
source |
Provider 的注册地址,格式为 命名空间/类型 |
从 Terraform Registry 获取官方源 |
version |
版本约束,避免意外升级导致兼容性问题 | 使用 ~> x.y 锁定大版本 |
region |
目标云服务区域 | 通过变量传入,避免硬编码 |
| 认证信息 | AccessKey/SecretKey 或角色扮演 | 优先使用环境变量或 CI/CD 密钥管理 |
安全警示: 永远不要将 AccessKey/SecretKey 硬编码在
.tf 文件中。使用 terraform.tfvars 配合 .gitignore 忽略,或通过环境变量注入。
2.2 资源声明:定义基础设施对象
资源是 Terraform 的核心抽象,使用 resource "provider_type" "local_name" 语法声明。每个资源块定义了一个云上对象及其配置参数。
# 声明一个弹性伸缩组(ESS)
resource "alicloud_ess_scaling_group" "web" {
scaling_group_name = "web-scaling-group"
min_size = 2
max_size = 10
vswitch_ids = ["vsw-xxx", "vsw-yyy"]
removal_policies = ["OldestInstance", "NewestInstance"]
default_cooldown = 300
# 标签用于资源分类
tags = {
Environment = "production"
Team = "platform"
}
}
# 声明一个伸缩规则
resource "alicloud_ess_scaling_rule" "scale_out" {
scaling_group_id = alicloud_ess_scaling_group.web.id
scaling_rule_name = "scale-out-cpu-80"
adjustment_type = "TotalCapacity"
adjustment_value = 5
cooldown = 60
}
资源声明遵循 依赖图 机制:Terraform 自动分析资源间的引用关系(如 alicloud_ess_scaling_group.web.id),按正确顺序创建、更新或销毁资源。
关键概念: 资源地址(Resource Address)格式为
resource_type.local_name,用于在状态文件、输出值和依赖引用中唯一标识资源。
2.3 变量与输出:参数化与数据传递
变量(variable)让配置可复用;输出(output)将资源属性暴露给外部或作为模块返回值。
变量声明与使用
# variables.tf
variable "region" {
description = "部署区域"
type = string
default = "cn-hangzhou"
}
variable "instance_types" {
description = "ECS 实例规格列表"
type = list(string)
default = ["ecs.g6.large", "ecs.g6.xlarge"]
}
variable "enable_autoscaling" {
description = "是否启用弹性伸缩"
type = bool
default = true
}
# 使用变量
resource "alicloud_ess_scaling_group" "app" {
min_size = var.enable_autoscaling ? 2 : 1
# ...
}
输出值声明
# outputs.tf
output "scaling_group_id" {
description = "创建的伸缩组 ID"
value = alicloud_ess_scaling_group.web.id
}
output "scaling_group_arn" {
value = alicloud_ess_scaling_group.web.arn
}
output "instance_private_ips" {
description = "伸缩组内实例的私网 IP 列表"
value = alicloud_ess_scaling_group.web.private_ip_addresses
}
| 元素 | 作用 | 常用类型 |
|---|---|---|
variable |
接收外部输入,实现配置参数化 | string, number, bool, list, map, object |
output |
暴露资源属性,供 CLI 查看或模块间传递 | 任意 Terraform 表达式 |
locals |
定义内部计算值,减少重复表达式 | 任意 Terraform 表达式 |
最佳实践: 使用
terraform.tfvars 文件为变量赋值,通过 terraform plan -var-file="prod.tfvars" 切换环境。敏感变量(如密码)使用 sensitive = true 标记,避免在日志中明文显示。
2.4 状态文件管理:基础设施的“真相来源”
Terraform 状态文件(terraform.tfstate)记录了所有被管理资源的当前属性。它是 Terraform 判断“创建、更新、删除”的依据。
状态文件的核心作用
- 映射关系: 将配置中的资源地址与云上真实资源 ID 绑定。
- 性能优化: 避免每次
plan/apply都调用全部 API 列举资源。 - 依赖解析: 存储资源间的属性引用值,支持复杂依赖图。
远程状态存储(Backend)
团队协作时必须使用远程后端,避免状态文件冲突或丢失。
# backend.tf - 使用阿里云 OSS 存储状态
terraform {
backend "oss" {
bucket = "my-terraform-state-bucket"
prefix = "prod/autoscaling"
key = "terraform.tfstate"
region = "cn-hangzhou"
# 建议启用服务端加密
encrypt = true
}
}
| 后端类型 | 适用场景 | 优势 |
|---|---|---|
| 本地(local) | 个人学习、单机实验 | 无需额外配置 |
| OSS / S3 | 中小团队、标准项目 | 低成本、支持版本控制 |
| Terraform Cloud | 企业级协作、策略即代码 | 内置 VCS 集成、远程执行 |
| Consul / etcd | 动态锁、高可用场景 | 强一致性、支持事务 |
状态文件安全: 状态文件可能包含明文密码、密钥或敏感配置。务必启用后端加密(如 OSS 服务端加密),并限制对状态文件的访问权限。不要将
.tfstate 文件提交到 Git 仓库。
2.5 核心工作流与状态生命周期
下图展示了 Terraform 从配置到状态持久化的完整流程,以及状态文件在其中的核心位置。
2.6 状态文件操作命令速查
| 命令 | 用途 | 注意事项 |
|---|---|---|
terraform state list |
列出状态中所有资源地址 | 用于确认资源是否被管理 |
terraform state show <地址> |
查看某个资源的详细属性 | 调试时快速获取属性值 |
terraform state mv <源> <目标> |
重命名或移动资源地址 | 重构配置时保持状态一致性 |
terraform state rm <地址> |
从状态中移除资源(不销毁) | 用于将资源移出 Terraform 管理 |
terraform state pull |
从远程后端拉取最新状态 | 调试远程状态冲突时使用 |
terraform state push |
手动推送本地状态到远程 | 谨慎使用,可能覆盖远程状态 |
状态锁定: 使用支持锁定的后端(如 OSS + DynamoDB、Consul)可以防止多人同时执行
apply 导致状态损坏。Terraform Cloud 默认提供状态锁定功能。
2.7 本章小结
通过本章回顾,你已掌握 Terraform 的四大基础支柱:
- Provider 配置:建立与云平台的认证连接,指定区域和版本约束。
- 资源声明:使用
resource块定义基础设施对象,利用依赖图自动编排。 - 变量与输出:通过
variable实现参数化,通过output暴露关键属性。 - 状态文件管理:理解
terraform.tfstate的核心作用,掌握远程后端配置与状态操作命令。