跳至主要内容

帮助我们测试 OpenTofu 1.8.0-alpha1

Help us test OpenTofu 1.8.0-alpha1

大家好,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 上与我们聊天。