技术博客

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 生态最新工具对比。

OpenTofuTerraformIaC基础设施即代码自动化运维DevOpsHashiCorp云原生

如果你最近在选 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 项目,迁移成本极低,可以按照团队节奏逐步切换。