OpenTofu vs Terraform 2026:IaC 工具选型与迁移实战
2023 年 HashiCorp 将 Terraform 从 MPL 改为 BSL 许可证,随后社区分叉出 OpenTofu(加入 Linux Foundation/CNCF)。2024 年 IBM 以 64 亿美元收购 HashiCorp。2026 年,OpenTofu 已发展到 v1.12,与 Terraform 在功能上开始出现实质差异。本文对比两者现状、讲解如何从 Terraform 迁移到 OpenTofu(零状态迁移)、关键配置写法差异,以及 2026 年 IaC 生态最新工具对比。
如果你最近在选 IaC 工具,或者在评估是否要从 Terraform 切换到 OpenTofu,本文帮你理清楚现状。
背景:为什么会有 OpenTofu
时间线:
2023 年 8 月
HashiCorp 宣布 Terraform 从 MPL 2.0 改为 BSL 1.1
BSL 限制:不能用于与 HashiCorp 直接竞争的商业产品
→ 这影响了大量基于 Terraform 构建服务的公司
2023 年 9 月
Linux Foundation 宣布成立 OpenTofu 项目
由 Gruntwork、Spacelift、env0 等公司联合发起
目标:维护一个永久开源(MPL 2.0)的 Terraform 分叉
2024 年 4 月
OpenTofu 进入 CNCF 孵化阶段
2024 年 4 月
IBM 以 64 亿美元收购 HashiCorp(包含 Terraform)
2026 年
OpenTofu v1.12 稳定版
与 Terraform 在功能上开始出现实质分歧
2026 年两者的现状
OpenTofu v1.12(2026 年 6 月最新稳定版)
许可证:MPL 2.0(真正开源)
治理:Linux Foundation / CNCF
兼容性:100% Terraform provider 兼容
状态文件:与 Terraform 兼容(可双向迁移)
新功能:社区驱动,加入了一些 Terraform 官方未做的功能
Terraform(IBM/HashiCorp 维护)
许可证:BSL 1.1(有商业限制)
治理:IBM 旗下 HashiCorp
兼容性:基准
新功能:整合进 HashiCorp 产品套件(Terraform Cloud/HCP)
方向:AI 辅助基础设施管理(HCP 集成 AI)
迁移:从 Terraform 到 OpenTofu
迁移成本很低,因为两者的代码和状态文件完全兼容。
安装 OpenTofu
# Linux(推荐方式)
curl --proto '=https' --tlsv1.2 -fsSL \
https://get.opentofu.org/install-opentofu.sh | sh
# 或者用包管理器(Ubuntu)
echo "deb [signed-by=/etc/apt/keyrings/opentofu.gpg] \
https://packages.opentofu.org/opentofu/tofu/any/ any main" \
| tee /etc/apt/sources.list.d/opentofu.list
apt-get update && apt-get install tofu
# macOS
brew install opentofu
# 验证安装
tofu version
# OpenTofu v1.12.2
# on linux_amd64
迁移现有 Terraform 项目
# 场景:你有一个 Terraform 项目,想切换到 OpenTofu
# 步骤 1:在现有项目目录中直接用 tofu 替换 terraform
cd your-terraform-project
# 步骤 2:初始化(tofu 会识别现有的 .terraform 目录和 state)
tofu init
# 步骤 3:验证 plan 结果与 terraform 一致
tofu plan
# 就这样,没有其他步骤
# state 文件格式完全兼容,不需要迁移
为什么这么简单:
OpenTofu 和 Terraform 使用相同的 state 文件格式(JSON)
HCL 语法完全兼容
Provider 从同一个 Registry 拉取(registry.terraform.io)
.tfvars / backend 配置文件完全通用
不需要做的事:
✗ 不需要修改 .tf 文件
✗ 不需要迁移 state 文件
✗ 不需要重新申请 Provider credentials
迁移前的注意事项
# 检查你用的 provider 是否在 OpenTofu Registry 上也有
# (绝大多数都有,因为 provider 本身是开源的)
# OpenTofu 也支持 Terraform Registry 的 provider
# 只需要在 required_providers 里指定来源
terraform {
required_providers {
aws = {
source = "hashicorp/aws" # 这个来源在两边都支持
version = "~> 5.0"
}
}
}
功能差异(2026 年)
OpenTofu 在某些功能上开始超前于 Terraform:
1. 加密 State 文件(OpenTofu 独有)
# OpenTofu 支持在 backend 层面加密 state 文件
# Terraform 目前没有这个功能
terraform {
encryption {
key_provider "pbkdf2" "my_passphrase" {
passphrase = var.state_encryption_passphrase
}
method "aes_gcm" "my_method" {
keys = key_provider.pbkdf2.my_passphrase
}
state {
method = method.aes_gcm.my_method
}
plan {
method = method.aes_gcm.my_method
}
}
}
2. 更灵活的变量引用(OpenTofu v1.8+)
# OpenTofu 允许在 provider 配置中直接引用变量
# Terraform 某些版本不支持
provider "aws" {
region = var.aws_region # OpenTofu 支持
# Terraform 早期版本需要用 locals 中转
}
# 也支持在 backend 配置中引用变量(Terraform 不支持)
terraform {
backend "s3" {
bucket = var.tfstate_bucket # OpenTofu 支持
key = "prod/terraform.tfstate"
region = var.aws_region
}
}
3. 测试框架增强(OpenTofu)
# OpenTofu 的 test 命令有更多功能
# 文件:tests/main.tftest.hcl
run "verify_s3_bucket" {
command = plan
assert {
condition = aws_s3_bucket.main.bucket == "my-prod-bucket"
error_message = "Bucket name is wrong"
}
}
run "verify_encryption" {
command = apply
assert {
condition = aws_s3_bucket_server_side_encryption_configuration.main != null
error_message = "Bucket must have encryption enabled"
}
}
常见 IaC 配置示例
无论用 Terraform 还是 OpenTofu,写法完全相同:
完整的 Kubernetes 集群 IaC(以阿里云为例)
# main.tf
terraform {
required_version = ">= 1.5"
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.200"
}
}
backend "oss" {
bucket = "my-tfstate-bucket"
prefix = "prod/k8s"
region = "cn-hangzhou"
key = "terraform.tfstate"
endpoint = "oss-cn-hangzhou.aliyuncs.com"
}
}
# VPC
resource "alicloud_vpc" "main" {
vpc_name = "prod-vpc"
cidr_block = "10.0.0.0/8"
}
# 交换机(Subnet)
resource "alicloud_vswitch" "main" {
count = 3
vpc_id = alicloud_vpc.main.id
cidr_block = "10.${count.index}.0.0/16"
zone_id = data.alicloud_zones.available.zones[count.index].id
vswitch_name = "prod-vswitch-${count.index}"
}
# ACK 托管版 Kubernetes 集群
resource "alicloud_cs_managed_kubernetes" "main" {
name = "prod-k8s"
cluster_spec = "ack.pro.small"
kubernetes_version = "1.30.x"
worker_vswitch_ids = alicloud_vswitch.main[*].id
pod_cidr = "172.16.0.0/16"
service_cidr = "192.168.0.0/24"
new_nat_gateway = true
addons {
name = "terway-eniip" # 使用 Terway CNI(基于 VPC)
}
addons {
name = "arms-prometheus" # 内置监控
config = jsonencode({})
}
}
# 工作节点池
resource "alicloud_cs_kubernetes_node_pool" "workers" {
cluster_id = alicloud_cs_managed_kubernetes.main.id
node_pool_name = "prod-workers"
instance_types = ["ecs.c7.2xlarge"]
desired_size = 3
min_size = 2
max_size = 10
vswitch_ids = alicloud_vswitch.main[*].id
system_disk_category = "cloud_essd"
system_disk_size = 120
auto_repair = true
auto_upgrade = false # 生产环境手动控制升级时机
}
2026 年 IaC 工具生态对比
主流选择:
OpenTofu / Terraform(声明式,最普及)
适合:多云资源管理,与 GitOps 结合
生态:Provider 最多(AWS/GCP/Azure/阿里云等数千个)
学习曲线:中等(HCL 语法)
Pulumi(编程语言 IaC,Python/Go/TypeScript)
适合:有编程背景,需要复杂逻辑的场景
生态:使用 Terraform Provider,兼容性好
学习曲线:低(用你熟悉的语言)
Crossplane(K8s 原生 IaC)
适合:已有 Kubernetes 集群,想统一管理外部资源
特点:用 Kubernetes CRD 描述云资源,GitOps 友好
学习曲线:高(需要理解 K8s 和 Provider 机制)
Ansible(过程式,配置管理)
适合:服务器配置,应用部署,不适合基础设施创建
与 Terraform/OpenTofu 是互补关系(不是竞争)
选型建议:
新项目 → OpenTofu(免费、开源、永久可用)
已有 Terraform 项目 → 评估后迁移,成本几乎为零
需要编程逻辑 → Pulumi
K8s 重度用户 → Crossplane 值得评估
小结
从技术角度看,OpenTofu 和 Terraform 对大多数用户来说没有功能差异——用 Terraform 写的配置,复制过来就能直接跑。
选择的核心是许可证:OpenTofu 的 MPL 2.0 没有任何商业限制,任何公司可以自由使用;Terraform 的 BSL 有竞争条款,部分场景需要法务审查。
对于新项目,OpenTofu 是更简单的选择;对于存量 Terraform 项目,迁移成本极低,可以按照团队节奏逐步切换。
