




















本文最后更新于37 天前,其中的信息可能已经过时,如有错误请发送邮件到[email protected]
2024 年 1 月,Linux 基金会正式发布了 OpenTofu 的第一个稳定版本,这是一个从 Terraform 分支而来的开源基础设施即代码工具。面对云服务商的许可证变更,OpenTofu 承诺保持 MPL 2.0 协议开放。本文将通过一个完整的实战案例——用 OpenTofu 在本地 Docker 环境中启动一个 Nginx 容器——带你快速上手这个工具。
简单来说,它就是曾经免费的 Terraform 的社区维护版,与 Terraform 语法完全兼容,你甚至可以将原有的 .tf 文件直接拿来用。它的工作流依然是熟悉的 init → plan → apply。
· 一台安装好 Docker 的机器(Windows/macOS/Linux 均可)
· 基本的终端操作能力
Docker 安装可参考官方文档,确认 docker ps 可正常运行。
在 macOS 上:
brew install opentofu其他系统可以从 GitHub Releases 下载二进制文件,解压后放到 PATH 中。
验证安装:
tofu --version看到 OpenTofu v1.6.0 类似字样即为成功。
创建一个新目录,比如 tofu-nginx,在里面新建文件 main.tf:
terraform {
required_version = ">= 1.6.0"
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {
# 默认连接本地 Docker 守护进程,无需额外配置
}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
name = "opentofu-nginx-demo"
ports {
internal = 80
external = 8080
}
}这段代码的含义:
· 声明需要 docker provider。
· 拉取 nginx:latest 镜像。
· 创建一个名为 opentofu-nginx-demo 的容器,将本机 8080 端口映射到容器 80 端口。
在终端中进入该目录,执行:
tofu init此命令会下载所需的 provider 插件,与 Terraform 相同。
然后执行:
tofu plan你会看到一个清晰的执行计划,显示将要创建的资源。确认无误后,执行:
tofu apply输入 yes 确认,等待几十秒,容器就创建完成了。
打开浏览器访问 http://localhost:8080,你会看到熟悉的 “Welcome to nginx!” 页面。这就是我们用代码定义出来的 Web 服务。
OpenTofu 会生成一个 terraform.tfstate 文件保存当前资源状态,千万不要手动修改。
当你不需要这个容器时,执行:
tofu destroy再次输入 yes,所有资源将被安全清除,不留残留。
如果你从 Terraform 迁移,只需要把 terraform 命令替换为 tofu,terraform.tfstate 可以无缝继续使用。社区还提供了迁移工具 tf2tofu,可以自动重命名相关文件和模块引用。
为了让配置更灵活,我们创建 variables.tf:
variable "container_name" {
default = "my-nginx"
}
variable "host_port" {
default = 8080
}修改 main.tf 中的 name 和 external 为 var.container_name 和 var.host_port。
然后创建 outputs.tf:
output "nginx_url" {
value = "http://localhost:${var.host_port}"
}再次 tofu apply 后,会在终端直接输出访问地址。这就是 IaC 的基本玩法。
结语
OpenTofu 的出现让基础设施自动化真正回归社区。通过这个简单的 Docker 部署教程,你会发现它上手难度几乎为零。下一步,你完全可以把这个模式迁移到 AWS、阿里云等云平台,用代码管理自己的所有云端资源。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。