跳至主要内容

OpenTofu 1.7.0-beta1 即将发布

Get ready for OpenTofu 1.7.0-beta1

此版本包含提供商定义函数以及 alpha 版本的重大改进。

alpha 版本 一样,我们尽一切努力测试了此版本,并希望社区能够帮助我们在**非生产**工作负载上测试此版本。 在 GitHub 上获取您的副本,并使用 GitHub issue 告诉我们您的想法。

下载 beta 版本

beta 版本仅在 GitHub Releases 页面 上提供。请选择适合您平台的文件。以下是一些快速链接

平台/设备下载链接
台式 Windows 计算机
(64 位)
tofu_1.7.0-beta1_windows_amd64.zip
MacOS
(Macbook M1 或更高版本;ARM64)
tofu_1.7.0-beta1_darwin_arm64.tar.gz
MacOS
(Macbook M1 之前版本;AMD64)
tofu_1.7.0-beta1_darwin_amd64.tar.gz
Intel/AMD Linux 计算机或服务器
(AMD64)
tofu_1.7.0-beta1_linux_amd64.tar.gz
基于 ARM 的 Linux 计算机

Raspberry Pi 3 或更高版本

(ARM64)
tofu_1.7.0-beta1_linux_arm64.tar.gz

对于以上版本,请解压归档文件,您应该可以在其中找到 tofu 二进制文件。您还可以使用 独立安装程序 下载具有签名验证的版本。

提供商定义函数

新的 Terraform Plugin SDK 添加了对提供商定义函数的支持,您可以在 OpenTofu 中直接使用这些函数。与使用数据源相比,这是一个重大改进,因为提供商定义函数不会增加状态文件的大小,并且需要更少的代码编写。

如果您想测试提供商定义函数,可以使用 corefunc 提供商,该提供商由 Ryan Parman 开发。

代码块
terraform {
required_providers {
corefunc = {
source = "northwood-labs/corefunc"
version = "1.4.0"
}
}
}

provider "corefunc" {
}

output "test" {
value = provider::corefunc::str_snake("Hello world!")
# Prints: hello_world
}

可循环导入块

我们对声明式导入块进行了多项改进,最显著的是您现在可以在块上使用 for_each 指令。我们为此功能准备了 完整文档

在之前的 OpenTofu 版本中,您已经可以使用 import 块声明式地导入资源,例如

代码块
resource "random_id" "test_id" {
byte_length = 8
}

import {
to = random_id.test_id
id = "Y2FpOGV1Mkk"
}

output "id" {
value = random_id.test_id.b64_url
}

在此新版本中,您现在还可以循环声明式地导入资源

代码块
variable "server_ids" {
type = list(string)
}

resource "random_id" "test_id" {
byte_length = 8
count = 2
}

import {
to = random_id.test_id[tonumber(each.key)]
id = each.value
for_each = {
for idx, item in var.server_ids: idx => item
}
}

output "id" {
value = random_id.test_id.*.b64_url
}

上面的示例将允许您从变量中指定一些随机 ID,并让其他 ID 自动生成。

状态加密

状态加密是此版本的主要功能之一。我们为此功能准备了 完整文档。从 alpha 版本开始,我们彻底修改了从未加密到加密状态文件的迁移过程以及回滚机制,使语法更明确。

在测试此功能之前,请**备份**您的状态文件。然后,您可以添加以下块以启用状态加密

代码块
terraform {
encryption {
key_provider "pbkdf2" "my_passphrase" {
## Enter a passphrase here:
passphrase = ""
}

method "aes_gcm" "my_method" {
keys = key_provider.pbkdf2.my_passphrase
}

## Remove this after the migration:
method "unencrypted" "migration" {
}

state {
method = method.aes_gcm.my_method

## Remove the fallback block after migration:
fallback{
method = method.unencrypted.migration
}
## Enable this after migration:
#enforced = true
}
}
}

您可以使用以下语法进行回滚

代码块
terraform {
encryption {
key_provider "pbkdf2" "my_passphrase" {
## Enter a passphrase here:
passphrase = ""
}

method "aes_gcm" "my_method" {
keys = key_provider.pbkdf2.my_passphrase
}

method "unencrypted" "migration" {
}

state {
method = method.unencrypted.migration
enforced = false
fallback{
method = method.aes_gcm.my_method
}
}
}
}

如果您有权访问 AWS、GCP 帐户或已获得 OpenBao/MPL 许可的 HashiCorp Vault 安装,您还可以 测试这些密钥提供程序

移除块

移除块允许您从状态文件中移除资源,但将其保留在基础架构中。我们为此功能准备了 完整文档。您可以先创建资源来测试它

代码块
resource "local_file" "test" {
content = "Hello world!"
filename = "test.txt"
}

应用后,您可以用移除块替换资源

代码块
removed {
from = local_file.test
}

在下一次应用后,您将看到 local_file.test 资源不再存在于您的状态文件中,但 test.txt 文件应该仍然存在于您的磁盘上。现在,您可以安全地移除移除块。

内置函数更改

此版本还包含一些新函数和对现有函数的更改

CLI 更改

CLI 也有一些更改

  • tofu init 现在支持用于 JSON 输出的 -json 标志。
  • tofu plan 现在具有 -concise 标志以缩短计划输出。
  • tofu console 现在可在 Solaris 和 AIX 上运行。
  • CLI 现在支持 XDG 目录规范。
  • 别名:
    • state liststate ls
    • state mvstate move
    • state rmstate remove

测试功能更改

  • Tofu 现在从测试文件夹读取 .tfvars 文件。

提供反馈

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