跳至主要内容

OpenTofu Beta 1.8.0 发布

Get ready for OpenTofu Beta 1.8.0

OpenTofu 社区的朋友们,大家好!我们一直在努力根据你们的反馈改进 1.8.0-alpha1 版本!我们已经打磨了一些粗糙的边缘,并添加了一些新功能。

如果你有一个可以用来测试新功能的非生产环境,请尝试一下并通过 GitHub Issue 给我们反馈,即使只是告诉我们一切运行良好。

这篇文章将介绍如何下载新的预览版,并详细介绍在 1.8.0-alpha1 博客文章 中介绍的功能。

下载 beta 版

beta 版本只能从 GitHub 发布页面 下载。请选择适合你平台的文件。以下是一些快速链接

平台/设备下载链接
桌面 Windows 计算机
(64 位)
tofu_1.8.0-beta2_windows_amd64.zip
MacOS
(Macbook M1 或更高版本;ARM64)
tofu_1.8.0-beta2_darwin_arm64.tar.gz
MacOS
(Macbook M1 之前的版本;AMD64)
tofu_1.8.0-beta2_darwin_amd64.tar.gz
英特尔/AMD Linux 计算机或服务器
(AMD64)
tofu_1.8.0-beta2_linux_amd64.tar.gz
基于 ARM 的 Linux 计算机

树莓派 3 或更高版本

(ARM64)
tofu_1.8.0-beta2_linux_arm64.tar.gz

对于上面的版本,请解压缩档案,你应该会在里面找到 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 并启动实例

代码块
// This block will prevent OpenTofu from configuring aws provider.
// All provider's resources and data sources will be mocked.
mock_provider "aws" {
mock_data "aws_ami" {
defaults = {
id = "ami-12345"
}
}
}

run "test" {
assert {
condition = aws_instance.web.ami == "ami-12345"
error_message = "Incorrect AMI ID passed to aws_instance.web: ${aws_instance.web.ami}"
}
}

虽然这不能完全测试整个配置过程,但它可以突出显示由于资源错误连接在一起而可能发生的错误,而无需实际使用 AWS 账户。

tofu test 中覆盖资源

在 OpenTofu 1.8.0-alpha1 中首次引入,你现在可以从测试中覆盖资源、数据源和整个模块,允许你创建类似于传统软件测试中模拟的行为。例如,考虑以下在 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 来覆盖整个模块。

早期变量/局部变量评估

在 OpenTofu 1.8.0-alpha1 中引入,此功能允许你将变量和局部变量用于后端模块源加密配置,只要它们不依赖于资源、数据源或模块输出。即使局部变量引用了一个变量,这也是有效的,例如。这只是一系列改进中的第一步,这些改进将使 .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 文件中覆盖它,以用于 OpenTofu。

错误修复和改进

静态变量规划

现在在计划文件嵌入时正确处理静态变量。这被报告为一个错误,在 1.8.0-alpha1 中发现。

代码块
tofu plan -out=tofu.tfstate -var="param=value"
# Variables are correctly read from the given plan and should not be specified via CLI
tofu show tofu.tfstate
tofu apply tofu.tfstate

改进的提供程序错误消息

beta 版还包括配置错误的提供程序生成的错误消息的改进。一些需要配置块的默认提供程序能够生成以下错误消息

代码块

│ Error: Insufficient features blocks

│ on <empty> line 0:
│ (source code not available)

│ At least 1 "features" blocks are required.

此错误消息现在将包含有关哪个提供程序遇到特定缺少块验证问题的信息,以帮助用户跟踪它。

提供反馈

感谢您抽出时间测试此预览版。如果您有任何反馈,请使用GitHub 问题或在OpenTofu Slack 上与我们聊天。