用途
本技能面向需要了解、安装或从 Terraform 迁移到 OpenTofu 的场景。OpenTofu 是 Terraform 的开源分支,2023 年 HashiCorp 将 Terraform 许可证从 MPL 2.0 改为 BSL(Business Source License)后创建,由 Linux Foundation 治理,与 Terraform 1.5.x 保持完全兼容,并加入社区驱动的功能。
主要能力
许可证与治理差异
- Terraform(HashiCorp):2023 年 8 月起采用 BSL,对竞争性产品的商业使用有限制;IBM 于 2024 年收购 HashiCorp。
- OpenTofu:采用 MPL 2.0,真正开源,由 Linux Foundation 治理,社区驱动开发。
功能创新
OpenTofu 1.7 特性:状态加密(客户端加密,社区呼吁 5 年以上)、可循环导入块(import 块中使用 for_each)、动态 Provider 函数、早期变量求值(terraform 块中使用变量)。
OpenTofu 1.8 特性(最新):OpenTofu 专属覆盖、扩展的早期变量求值(模块源中使用变量/locals)、增强的 Provider 支持。
Terraform 优势:HCP Terraform 云平台(Stacks、HYOK、Private VCS Access)、企业支持、更大的生态、Sentinel 策略(350+ NIST 策略)。
兼容性
100% 兼容:HCL 语法、Provider 生态(同一 registry)、状态文件格式(Terraform 1.5.x)、模块结构、CLI 命令。迁移路径为 Terraform 1.5.x 的直接替换,无需修改代码,状态文件可移植(需考虑加密)。
使用方式
安装 OpenTofu
Windows:
choco install opentofu
scoop install opentofu
或从 https://github.com/opentofu/opentofu/releases 手动下载。
macOS:
brew install opentofu
curl -L https://github.com/opentofu/opentofu/releases/download/v1.8.0/tofu_1.8.0_darwin_amd64.tar.gz | tar xz
sudo mv tofu /usr/local/bin/
Linux:
snap install opentofu --classic
curl -fsSL https://get.opentofu.org/install-opentofu.sh | sh
wget https://github.com/opentofu/opentofu/releases/download/v1.8.0/tofu_1.8.0_linux_amd64.tar.gz
tar -xzf tofu_1.8.0_linux_amd64.tar.gz
sudo mv tofu /usr/local/bin/
从 Terraform 迁移
- 评估兼容性:
terraform version(需为 1.5.x 或兼容版本)、terraform providers。 - 安装 OpenTofu。
- 测试兼容性:
tofu init、tofu validate、tofu plan。 - 迁移状态(可选):不使用状态加密时状态兼容,无需迁移,直接改用 tofu 命令;启用状态加密时在 .tofu 文件中配置 encryption 块,设置
TOFU_ENCRYPTION_KEY,执行tofu init -migrate-state。 - 更新 CI/CD:GitHub Actions 使用
opentofu/setup-opentofu@v1;Azure DevOps 使用 Bash 任务执行安装脚本;GitLab CI 使用镜像ghcr.io/opentofu/opentofu:1.8.0。
状态加密(OpenTofu 独有)
支持 AES-GCM 基本加密、密钥轮换(fallback 旧密钥解密)、云 KMS 集成(AWS KMS、Azure Key Vault、GCP KMS)。最佳实践:密钥安全存储(不提交到仓库,使用 CI/CD secrets)、定期轮换密钥、启用加密前备份未加密状态。
可循环导入块(OpenTofu 1.7+)
在 import 块中使用 for_each 批量导入多个资源,例如通过 locals 定义资源组映射后循环导入。
早期变量求值(OpenTofu 1.7+)
允许在 terraform 块(如 backend 配置)中使用变量;1.8+ 支持在模块源中使用变量,实现动态模块版本。
命令兼容性
所有 Terraform 命令在 OpenTofu 中行为一致,只需将 terraform 替换为 tofu:init、plan、apply、destroy、state、import、validate、fmt、output。
适用场景
选择 OpenTofu:组织政策要求开源工具、需要供应商中立、担心未来许可证变化、合规要求客户端加密、希望无需 HCP Terraform 即可加密、多云端加密需求、希望免费状态加密、预算受限、希望影响路线图、偏好 Linux Foundation 治理。
选择 Terraform:需要 HCP Terraform Stacks、HYOK、Private VCS Access、Sentinel 策略执行、直接 HashiCorp/IBM 支持、SLA 保证、合规认证、临时值(1.10+)、Terraform Query(1.14+)、Actions 块(1.14+)、优先获得最新 Provider 特性、已有 HCP Terraform 投资。
限制
本技能资料未提供 OpenTofu 的收费、价格信息;未提供官方支持 SLA 的具体条款;未提供除已列版本外的其他版本细节。迁移建议中提及多数项目迁移耗时小于 1 小时,但实际耗时因项目而异。