Skip to content

参考

基于 Terraform(1.x)· 核于 2026-07。命令与关键字对 OpenTofu(tofu)基本通用。完整文档见 developer.hashicorp.com/terraform

速查

  • 主工作流initvalidateplanapplydestroyfmt 规范格式。
  • 看状态state list / state show / show / output
  • 改地址state mv(或声明式 moved 块);脱管 state rm(或 removed 块)。
  • 纳管已有资源import 块 + plan -generate-config-out(新)或 terraform import(旧)。
  • 顶层块terraform / provider / resource / data / variable / output / locals / module / import / moved / removed / check
  • meta-argumentscount / for_each / depends_on / provider / lifecycle
  • 替换资源apply -replace="aws_instance.web"(取代旧 taint),可先 plan 预演。
  • 版本约束~> 5.1 锁 minor(<6.0)、~> 5.1.0 锁 patch(<5.2.0)、= 精确、>= 下限。
  • 调试terraform console 交互式求值表达式;TF_LOG=DEBUG 看详细日志。
  • 环境变量TF_VAR_* 赋值、TF_WORKSPACE 选 workspace、TF_IN_AUTOMATION/TF_INPUT=0 供 CI。
  • 锁文件.terraform.lock.hcl 必须进 Git;state 不进 Git。
  • 许可:1.5.x=最后 MPL,1.6.0+=BUSL;纯开源用 OpenTofu(MPL、tofu)。

一、CLI 全命令

命令作用常用 flag
init初始化目录:装 Provider、连 backend、下模块-upgrade -backend-config= -reconfigure -migrate-state
validate校验语法与内部一致性(不连云)-json
plan生成执行计划(diff)-out=FILE -var -var-file= -target= -refresh-only -refresh=false -destroy
apply执行变更-auto-approve -var -var-file= -target= -parallelism=N apply FILE(执行已存计划)
destroy销毁受管资源(= apply -destroy-auto-approve -target=
fmt规范化 HCL 格式-recursive -check -diff
show显示 state 或已存 plan(可读/JSON)-json
output打印 output 值-json -raw NAME
refresh刷新 state 对齐真实(旧命令,改用 plan -refresh-only
console交互式表达式求值(调试函数/表达式利器)-var
graph输出依赖图(Graphviz DOT)-type=plan
providers列出配置所需 Provider;providers lock/mirror/schema 子命令
import命令式导入已有资源到 state(旧法)-var
taint / untaint标记/取消标记资源下次强制重建(旧法,改用 -replace=
state list列出 state 中所有资源地址
state show ADDR显示某资源在 state 中的属性
state mv SRC DST在 state 中重命名/搬移资源地址(不动真实资源)
state rm ADDR从 state 移除(不删真实资源,脱管)
state pull / push拉出 / 写入原始 state(备份/迁移,高危)
workspacenew / select / list / delete 多 state 工作区
login / logout登录/登出 HCP Terraform 或其它远程主机
force-unlock ID强制释放卡住的 state 锁(确认无进程在跑再用)
version显示版本

替换资源的现代写法

旧的 terraform taint 已不推荐,改用 terraform apply -replace="aws_instance.web" 在一次 plan/apply 中显式请求重建某资源,可先 plan 预演。

二、顶层块与关键字

用途
terraform {}全局设置:required_version / required_providers / backendcloud
provider "x" {}配置某 Provider(区域、认证等),可用 alias 建多实例
resource "T" "N" {}声明受管资源(增改删,进 state)
data "T" "N" {}只读数据源(查询已有信息,不创建)
variable "N" {}输入变量:type/default/description/sensitive/validation/nullable/ephemeral
output "N" {}输出值:value/description/sensitive/depends_on
locals {}命名局部值,local.<名> 引用
module "N" {}调用子模块:source/version + 入参
import {}配置驱动导入(to / id),1.5+
moved {}声明式记录资源地址迁移,代替 state mv
removed {}声明式脱管(从配置删除但不销毁真实资源),1.7+
check {}独立断言块(assert),巡检期望而不阻断,1.5+

三、meta-arguments(用在 resource/module)

meta-arg作用备注
count = N造 N 个实例count.index 取序号;引用 [i];中间删元素会连带重排
for_each = map/set按键造实例each.key/each.value;引用 ["k"];增删稳定,优先用它
depends_on = [...]显式依赖隐式依赖(引用属性)无法表达时才用
provider = x.alias指定用哪个 Provider 实例多区域/多账号场景
lifecycle {}生命周期干预见下表

lifecycle 子参数

参数作用
create_before_destroy替换时先建新再删旧(零停机)
prevent_destroy拦截任何销毁计划(防误删)
ignore_changes = [...]忽略指定属性的漂移
replace_triggered_by = [...]被引用对象变化时强制替换本资源
precondition {} / postcondition {}前置/后置断言,不满足则失败

四、常用内置函数(分类速查)

类别代表函数
字符串format join split replace lower/upper trimspace substr regex templatefile
集合length concat merge keys/values lookup contains flatten distinct toset slice element
数值min max abs ceil/floor pow
编码jsonencode/jsondecode yamlencode/yamldecode base64encode/base64decode
文件file fileexists templatefile pathexpand abspath
加密/哈希sha256 md5 bcrypt uuid filesha256
网络/IPcidrsubnet cidrhost cidrsubnets
类型/容错try can tolist/toset/tomap coalesce nonsensitive
时间timestamp timeadd formatdate

调试表达式与函数用 terraform console——交互式即时求值。

五、常用环境变量

变量作用
TF_VAR_<name>给输入变量 <name> 赋值
TF_LOG日志级别:TRACE/DEBUG/INFO/WARN/ERROR
TF_LOG_PATH日志写入文件
TF_CLI_ARGS / TF_CLI_ARGS_<cmd>给命令追加默认参数(如 TF_CLI_ARGS_plan
TF_WORKSPACE选择 CLI workspace
TF_DATA_DIR覆盖 .terraform 目录位置
TF_IN_AUTOMATION非空时精简为 CI 友好输出
TF_INPUT=0禁止交互式提问(CI 常设)

六、坑速查

说明与对策
count 中间删元素后续索引整体前移 → 大量无辜资源重建。改用 for_each(稳定键)
敏感值明文进 statesensitive 只打码回显、不影响 state 存储。远程 backend + 加密 + 访问控制;临时值用 ephemeral
state 提交进 Git泄露全部密钥。.gitignore*.tfstate*,state 走远程 backend
忘记提交 .terraform.lock.hcl团队/CI Provider 版本不一致。必须提交锁文件
backend 块里写变量backend 不能引用 var/local。用 partial config:init -backend-config=
-target 常态化只应急用;长期用会让 state 与配置逐渐不一致
provisioner 当常规手段破坏声明式/幂等、不进 plan。用 cloud-init/Ansible 替代
手改云资源(drift)下次 apply 悄悄改回或打架。铁律:别绕过 Terraform 手改
apply 不带 -out审的 plan 与执行的 plan 可能不是同一份。CI 用 plan -out + apply FILE
~> 用错层级~> 5.1 锁到 minor(<6.0),~> 5.1.0 锁到 patch(<5.2.0),别混
误把两种 workspace 混谈CLI workspace(多 state)≠ HCP workspace(管理单元),语境要分清

七、许可与版本时间线

时间事件
2014Terraform 首次发布,MPL 2.0 开源
2023-08-10HashiCorp 宣布许可 MPL 2.0 → BUSL 1.1(非开源,source-available)
2023-08-25社区分叉,OpenTF(后改名 OpenTofu)公开
2023-09-20OpenTofu 被 Linux Foundation 接纳
2023-10Terraform 1.6.0——首个 BUSL 版本(1.5.x 是最后 MPL);OpenTofu 以其为 drop-in 基线
2024-04Terraform Cloud 更名 HCP Terraform;IBM 宣布收购 HashiCorp
2025-02-27IBM 以约 64 亿美元完成对 HashiCorp 的收购

BUSL 1.1 要点:源码可见、可改、可内部使用;禁止竞争性商业用途;每版发布 4 年后自动转 MPL 2.0。纯开源诉求选 OpenTofu(MPL 2.0,命令 tofu)。

八、权威链接