Terraform 与 OpenTofu:全面对比

  • infisical
  • 发布于 2025-08-09 15:38
  • 阅读 81

文章对比了 Terraform 与 OpenTofu 的关系、许可证和功能差异。核心结论是:两者在语法、扩展性和部署方式上几乎一致,OpenTofu 主要继承自 Terraform 最后一个开源版本,并持续追平新特性;真正的分水岭在于许可证——Terraform 转向 BSL 后限制了商业分发,而 OpenTofu 保持 MPL 2.0,更符合开源社区期待。文章还顺带介绍了如何用两者接入 Infisical 做密钥管理,强调 IaC 工具本身并不负责秘密管理。

前言

Terraform 和 OpenTofu 是流行的声明式 Infrastructure as Code(IaC)工具——它们允许开发者通过声明式编码语言来 provision 后端。它类似于数据库表可以通过像 Prisma 这样的声明式 ORM 来 provision,或者 Typeform 运行时可以通过 .tsconfig 文件来配置。值得注意的是,IaC 消除了通过 API 调用以命令式方式部署后端的需要;相反,开发者可以通过单个静态文件 provision 服务器、数据库、load balancer,甚至它们之间的关系。

Terraform 和 OpenTofu 经常被比较,因为它们有着相同的祖先:Terraform。具体来说,它们共享 Terraform 的 最后一个 开源版本,即 Terraform 1.6.x。这使得这种比较显得有点……单调。Terraform 和 OpenTofu 几乎是 同一个产品。它们的主要区别在于许可证:OpenTofu 自豪而明确地属于 Open Source Software(OSS),而 Terraform 现在则在 Business Service License(BSL)下分发。

当 Terraform 曾经 是开源时,它采用的是 Mozilla Public License(MPL),一种符合 OSI 的 OSS 许可证。然后,在 2023 年,Terraform 的商业开发者 HashiCorp 转向了 BSL 许可证,该许可证允许开发者免费访问其源代码,但限制 devtools 销售由 Terraform 驱动的 IaC 产品。许多 Terraform 的粉丝和 OSS 坚定支持者对此反应不佳。许多人转向了 OpenTofu,这是 Terraform 最成功的 fork,并得到诸如 GruntworkSpaceliftHarnessEnv0Scalr 等流行 IaC 产品支持。

这种二元对立常见吗?

是,也不是。

Terraform 和 OpenTofu 之间的分裂并非异常。这是一个持续趋势中的最新案例:流行的 OSS 软件转向非 OSS 许可证,以针对该 OSS 软件的竞争性商业发行版。例如,Elasticsearch(暂时)放弃了 OSS,催生了 Opensearch。MongoDB 也做了同样的事情,创建了 FerretDB

通常,分裂会发生,而曾经开源的项目会悄悄地与开源 fork 竞争。对于旗舰产品来说,这通常不构成挑战。通常,OSS fork 在功能上落后于旗舰项目,因为社区开发者通常无法跟上原始项目的步伐。

然而,Terraform 和 OpenTofu 仍然 非常 相似,甚至在分裂多年后几乎完全相同。这种可互换性造成了一些紧张局势。2024 年,HashiCorp 向 OpenTofu 的维护者发送了 一封停止侵权函, 指控 OpenTofu 在许可证变更后从 Terraform 的发布版本中窃取了代码。OpenTofu 否认了这一指控,而公开证据强烈表明 OpenTofu 严格使用的是 Terraform 最后一个 MPL 版本中的代码。自然,这场诉讼 引发了愤怒,许多社区开发者认为这不过是一场吓退开发者远离 OpenTofu 的噱头。

许可证:Terraform 和 OpenTofu 如何比较?

让我们从 Terraform 和 OpenTofu 许可证之间的实际差异开始。毕竟,一些 OSS 项目本质上只是“OSSish”,带有非常特定的限制。

为了更好地理解 Terraform 的新许可证,让我们从 Terraform 最初的产品线开始。

以前,Hashicorp 有 三个 产品:Open Source、Enterprise 和 Cloud。Terraform 的核心功能位于 Terraform 的 Open Source 发行版中;更面向企业的功能建立在 OSS 代码之上,并以专有许可证提供。这种结构通常被称为 open core。与此同时,Terraform 的 Cloud 产品则是其开源版和 Enterprise 产品的托管版本。

最终,Terraform 被社区广泛采用,而其他 IaC 工具则鼓励开发者将 Terraform 作为默认编排语言。然而,HashiCorp 并不会从这些产品中受益,因为这些外部 IaC 工具只是使用 Terraform 的 OSS 发行版。为了应对这些情况,Hashicorp 暂停了 Terraform 的 Open Source 产品,并在其新的 Business Source License(BSL 或 BUSL)下推出了 Community Edition。该许可证允许社区 fork 代码库、修改它、为其做贡献,并将其部署到自己的服务器上。换句话说,Terraform 的最终用户并没有被施加新的限制。事实上,如果他们愿意,他们可以继续使用免费、自托管版本的 Terraform。相反,这一许可证变化严格影响了那些销售托管 Terraform 产品的 Terraform 分发者。现在,这些分发者必须从 HashiCorp 购买特殊的商业许可证,才能分发 Terraform。

由于它对软件的商业使用施加了限制,OSI 不认为这种许可证属于开源。与此同时,OpenTofu fork 了 Terraform 的最后一个 MPL 版本,并一直维持着 MPL 2.0 许可证。MPL 2.0 是弱 copyleft:OpenTofu 文件的 fork 必须在相同的开源许可证下分发,但额外文件可以在不同许可证下发布。

功能:Terraform 和 OpenTofu 如何比较?

除了许可证差异之外,由于它们由不同团队开发,Terraform 和 OpenTofu 的核心功能之间还有一些 轻微 差异。不过,这些差异正随着 OpenTofu 持续不断、渐进式地实现功能对等而不断被消除。即使在今天,OpenTofu 仍被视为 Terraform 的“drop-in replacement”,并保持与原始 Terraform 相同的约定和语法。

自分裂以来,OpenTofu 会更新其代码库以模仿 Terraform 构建的新功能。例如,在 2025 年 2 月 27 日,Terraform 引入了 write-only attributes。2025 年 7 月 9 日,OpenTofu 发布了 同样的功能。因此,反复琢磨 Terraform 最新社区版和 OpenTofu 上一个跟进版本之间的细微差异并没有意义,因为这些差异很可能会在未来的 OpenTofu 版本中被消除。

除了功能之外,OpenTofu 还能安装 Terraform providers。换句话说,Terraform 的所有可扩展性功能都可以无缝映射到 OpenTofu。

部署:Terraform 和 OpenTofu 如何比较?

Terraform 和 OpenTofu 的部署选项几乎相同。

对于 Terraform,开发者可以使用 HashiCorp 的托管方案,或者委托给 HashiCorp 的合作伙伴之一。这些合作伙伴包括 Gruntwork、Env0 和 SpaceLift。对于 OpenTofu,同样的产品也可用。事实上,它们鼓励开发者使用 OpenTofu 而不是 Terraform,并且仍然是 OpenTofu 开发的财务支持者。

唯一的区别是,一些由 IaC 工具开发的功能可能会暂时依赖最近的 Terraform 功能,而这些功能(尚)无法在 OpenTofu 上使用。

Secret:你如何在 Terraform 和 OpenTofu 上管理 secret?

Terraform 和 OpenTofu 是 IaC 工具,不是 secret manager。然而,在 provision 基础设施时,需要 secret 来配置环境。Terraform 的 registry 包含与像 Infisical 这样基础的云 secret manager 的集成,以扩展 secret 管理能力。

Infisical 是一个统一的 secret 平台,兼容 TerraformOpenTofu。借助 Infisical,secret 可以被 轻松轮换或动态生成。Infisical 还管理证书和证书颁发机构,审计仓库中的潜在泄露,并且像 OpenTofu 一样是 OSS。

要使用 Terraform 设置 Infisical,开发者只需注册 Infisical Terraform provider。

terraform {
  required_providers {
    infisical = {
      # version = <latest version>
      source = "infisical/infisical"
    }
  }
}

provider "infisical" {
  host = "https://app.infisical.com" # 仅在使用 Infisical 自托管实例时需要,默认值为 https://app.infisical.com
  auth = {
    universal = {
      client_id     = "<machine-identity-client-id>"
      client_secret = "<machine-identity-client-secret>"
    }
  }
}

同样地,要使用 OpenTofu 设置 Infisical,鉴于 Terraform 和 OpenTofu 的跨兼容性,开发者可以注册完全相同的 provider。也就是说,字面意义上的同一个 provider——他们在 OpenTofu 文件中仍然会使用 terraform{},因为它引用的是同一个 endpoint。

品牌:Terraform 还是 OpenTofu 有更好的名字?

OpenTofu。谁不喜欢 Tofu 呢?

总结:Terraform 和 OpenTofu 如何比较?

一般来说,OpenTofu 和 Terraform 只在许可证上有所不同。为了总结这一点,我们整理了一份小抄:

Terraform vs OpenTofu

不过,OpenTofu 受到了开源社区的热烈欢迎;与此同时,Terraform 仍然是一个商业强者,并且被动地引领着 OpenTofu 的方向。

这两种工具都不支持强大的 secret 管理。对此,你应该依赖像 Infisical 这样的(开源)平台。

Mathew Pregasen

Infisical 技术写作者

  • 原文链接: infisical.com/blog/terra...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
infisical
infisical
江湖只有他的大名,没有他的介绍。