大家好,OpenTofu 社区!自从上次 OpenTofu 发布以来,我们一直在努力为您带来对 .tf 语言的急需改进:能够在后端、模块源和加密配置中使用变量(早期变量/局部变量评估)。这目前是 OpenTofu GitHub 上投票最多的问题,并且以各种形式被 OpenTofu 的前身请求了多年。
此外,我们为您带来了一项功能,让您在保持与 Terraform 兼容性的同时使用新的 OpenTofu 功能,以及能够在 tofu test
中覆盖资源和数据源。此版本还包括对 OpenTofu 各个部分的一系列较小的改进和错误修复 列在变更日志中。
现在我们想请您帮忙:我们已经尽一切努力确保新的 Alpha 版本不会破坏任何东西,我们需要您的帮助来测试此版本。如果您有一个非生产环境,您愿意在其中测试任何新功能,请试一试并给我们 通过 GitHub 问题提供反馈,即使只是告诉我们一切顺利。
这篇博文将介绍如何下载新的预览版,并详细说明每个新功能的工作原理。
不要在生产项目中测试此版本!它不是稳定版本!
下载 Alpha 版本
Alpha 版本仅从 GitHub 版本页面 提供。请选择适合您平台的文件。以下是一些快速链接
平台/设备 | 下载链接 |
---|---|
台式 Windows 计算机 (64 位) | tofu_1.8.0-alpha1_windows_amd64.zip |
MacOS (Macbook M1 或更高版本;ARM64) | tofu_1.8.0-alpha1_darwin_arm64.tar.gz |
MacOS (Macbook M1 之前版本;AMD64) | tofu_1.8.0-alpha1_darwin_amd64.tar.gz |
英特尔/AMD Linux 计算机或服务器 (AMD64) | tofu_1.8.0-alpha1_linux_amd64.tar.gz |
基于 ARM 的 Linux 计算机 或 树莓派 3 或更高版本 (ARM64) | tofu_1.8.0-alpha1_linux_arm64.tar.gz |
对于上述版本,请解压缩存档,您应该在其中找到 tofu
二进制文件。您也可以使用 独立安装程序 下载带有签名验证的版本。
早期变量/局部变量评估
此功能允许您使用变量和局部变量用于后端、模块源和加密配置,只要它们不依赖于资源、数据源或模块输出。即使局部变量引用了一个变量,这也适用。这只是一系列改进中的第一步,这些改进将使 .tf 代码更加灵活,更多改进将在未来的版本中发布。
tofu init
命令现在将使用您的 .tfvars
文件,并允许您使用 -var
和 -var-file
选项指定变量。请注意,此 Alpha 版本不会提示您输入缺少的变量,这是我们将在以后添加的功能。请注意,如果缺少静态评估所需的变量,tofu init
将失败。
例如,如果您想对 S3 后端和 AWS 提供程序使用相同的配置,您现在可以执行以下操作
variable "aws_region" {
default = "us-east-1"
}
terraform {
backend "s3" {
region = var.aws_region
}
}
provider "aws" {
region = var.aws_region
}
您也可以使用此功能来管理模块版本,包括注册表引用和 Git URL。
locals {
aws_module_version = "5.6.1"
}
module "webserver" {
source = "terraform-aws-modules/ec2-instance/aws"
version = local.aws_module_version
// Other ec2_instance options
}
module "db" {
source = "https://github.com/terraform-aws-modules/terraform-aws-ec2-instance?ref=v${local.aws_module_version}"
// Other ec2_instance options
}
最后,以下是如何使用变量设置带密码的加密
variable "passphrase" {
type = string
}
terraform {
encryption {
key_provider "pbkdf2" "my_passphrase" {
passphrase = var.passphrase
}
method "aes_gcm" "my_method" {
keys = key_provider.pbkdf2.my_passphrase
}
state {
method = method.aes_gcm.my_method
}
}
}
OpenTofu 的覆盖文件:保持兼容性
由于我们现在在 OpenTofu 中添加了 Terraform 中没有的功能,因此我们希望赋予模块作者编写适用于 OpenTofu 和 Terraform 的代码的能力,而无需维护模块的两个副本。您现在可以创建名为 .tofu
的文件,这些文件专属于 OpenTofu。如果您创建了一个名为 foo.tofu
的文件,OpenTofu 将忽略同名文件 foo.tf
。您可以使用此功能将特定于 Terraform 的代码放在 .tf
文件中,然后在 .tofu
文件中覆盖它。
tofu test
中的资源覆盖
此版本还为 tofu test
命令带来了改进。您现在可以从测试中覆盖资源、数据源和整个模块,从而允许您创建类似于传统软件测试中模拟的行为。例如,考虑以下代码,该代码在 AWS 上启动一个 m6i.2xlarge
实例
provider "aws" {
region = "us-east-1"
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-24.04-amd64-server-*"]
}
owners = ["099720109477"]
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "m6i.2xlarge"
}
与其查询 AMI ID 并启动实例,我们可以编写以下测试代码
provider "aws" {
access_key = "foo"
secret_key = "bar"
skip_credentials_validation = true
skip_region_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
}
# This block disables refreshing the aws_ami.ubuntu data source
# and lets you manually specify the values:
override_data {
target = data.aws_ami.ubuntu
values = {
id = "ami-12345"
}
}
run "test" {
# This block disables provisioning the aws_instance.web resource:
override_resource {
target = aws_instance.web
values = {
# You can add values here.
}
}
assert {
condition = aws_instance.web.ami == "ami-12345"
error_message = "Incorrect AMI ID passed to aws_instance.web: ${aws_instance.web.ami}"
}
}
虽然这不会完全测试整个供应过程,但它将突出显示可能由于资源连接不正确而导致的错误,而无需实际使用 AWS 账户。同样,您可以使用 override_module
覆盖整个模块。
提供反馈
感谢您抽出时间测试此预览版本。如果您有任何反馈,请使用 GitHub 问题 或在 OpenTofu Slack 上与我们聊天。