terraform

Terraform 是 HashiCorp 出品的开源基础设施即代码(Infrastructure as Code, IaC)工具。用户可通过声明式配置语言 HCL(HashiCorp Configuration Language)编写代码,描述如云服务(AWS、Azure、GCP)、本地环境、Kubernetes 集群等各类基础设施资源,并通过命令行高效自动化地创建、变更和管理这些资源。

核心特性:

  • 多平台支持:兼容主流云厂商、本地虚拟化、Kubernetes 等生态。
  • 声明式配置:聚焦于最终期望状态,具体变更细节由 Terraform 自动推导与执行。
  • 代码可审计:基础设施配置可纳入版本控制(如 Git),实现历史追踪与变更回滚。
  • 自动管理依赖:自动分析资源依赖关系,按需有序创建/销毁。
  • 模块化复用:支持自定义或社区模块,提升资源复用与可维护性。

Terraform 已广泛应用于 DevOps、云原生、自动化运维等领域,是实现基础设施自动化与一致性的关键工具。


常用命令速查

  • terraform init
    初始化当前目录,下载 provider 插件与模块。每次 provider、模块变更后需重新执行。
    可用 --plugin-dir 参数指定本地插件目录。

  • terraform plan
    生成并展示变更执行计划,只预览不实际操作

  • terraform apply
    执行 plan 阶段的变更,创建/修改/销毁资源。
    -auto-approve 可自动跳过交互确认。

  • terraform destroy
    一键销毁所有受管资源,操作需谨慎
    可配合 -auto-approve 实现自动化。

建议:

  • 每次变更(增删资源、provider 升级等)建议先 init,再 plan,确认无误后 apply
  • 生产环境强烈建议启用远程状态存储和 state 锁,避免多人冲突。
  • terraform import
    将已有基础设施资源纳入 Terraform 管理,无需重建。
    用法:terraform import ADDRESS ID
    导入后建议执行 terraform plan 核查与实际状态同步,并适当调整配置。

  • terraform refresh
    根据真实基础设施刷新本地 state 文件,保持一致性。

  • terraform state list
    列出现有 state 管理的所有资源地址。

  • terraform state rm
    从 state 中移除指定资源,仅影响 Terraform 管理,不实际删除资源。

  • terraform state pull
    拉取远程后端最新 state,常用于检查/备份。

  • terraform state push
    推送本地 state 到远程后端,常见于手动同步或恢复。


推荐目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
project-root/
├── main.tf # 主资源定义
├── variables.tf # 输入变量声明
├── outputs.tf # 输出变量声明
├── providers.tf # Provider 配置
├── terraform.tfvars # 变量取值(可选)
├── modules/ # 可复用模块
│ └── <module>/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
├── envs/ # 多环境分离(如 dev、prod)
│ ├── dev/
│ │ └── terraform.tfvars
│ └── prod/
│ └── terraform.tfvars
├── .terraform/ # Provider 插件缓存(自动生成)
└── terraform.tfstate # 状态文件(本地/远程)

# 说明
- 根目录 *.tf 文件:全局资源与变量。
- modules/:封装常用资源模板(如 vpc、ecs、rds)。
- envs/:区分不同环境的变量/后端配置。
- .terraform/ 与 terraform.tfstate 建议加入 .gitignore,避免泄密。

变量赋值方式与优先级

Terraform 支持多种变量赋值方式,优先级高→低如下:

  1. 命令行参数
    • terraform apply -var="key=value"
  2. 变量文件
    • terraform apply -var-file="xxx.tfvars"
  3. 环境变量
    • export TF_VAR_key=value
  4. 变量默认值
    • variables.tf 中通过 default 指定
  5. 交互式输入
    • 执行时手动输入

提示: 多种方式并存时,优先级高的覆盖低的。


表达式与函数实用笔记

  • 基础表达式
    • 属性引用:var.nameresource.type.name.attr
    • 运算符:!, *, /, +, -, >=, ==, !=, &&
    • 条件表达式:condition ? true_val : false_val
    • For 表达式:[for s in var.list : upper(s)]
    • Splat 表达式:var.list[*].id
    • 动态块:dynamic "block" { ... }
  • 约束与类型
    • 变量类型约束、provider 版本约束等
  • 常用内建函数
    • 数值:absfloormaxminpow
    • 字符串:formatjoinlowerreplacesplitsubstr
    • 集合:concatflattenmergesorttolist
    • 编码:base64encodejsonencodeurlencode
    • 文件系统:abspathdirnamebasenamefiletemplatefile
    • 时间日期:timestampformatdatetimeadd
    • 哈希加密:sha1sha256md5uuid
    • 类型转换:tostringtomaptolisttoset

详见官方文档:https://developer.hashicorp.com/terraform/language/functions


方案二:使用 Terraform Workspace 实现多环境隔离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 列出所有 workspace
terraform workspace list
# 输出示例:
# * default

# 创建并切换到 dev 环境
terraform workspace new dev
# 输出: Created and switched to workspace "dev"!

# 在 dev workspace 中创建资源
terraform apply -auto-approve

# 创建并切换到 testing 环境
terraform workspace new testing
# 输出: Created and switched to workspace "testing"!

# 在 testing workspace 中创建资源
terraform apply -auto-approve

# 查看所有 workspace
terraform workspace list

# 删除 testing 环境资源
terraform destroy -auto-approve

# 切换回 dev 环境
terraform workspace select dev

# 删除 dev 环境资源
terraform destroy -auto-approve

terraform
https://mfzzf.github.io/2025/05/19/terraform/
作者
Mzzf
发布于
2025年5月19日
许可协议