大家好!我们最近承担了 OpenTofu 自创立以来最具挑战性的任务,同时也有一段时间没有推出功能版本。今天,我们非常自豪地请求大家帮助测试 OpenTofu 1.9.0-alpha2。这次版本带来了备受期待的功能:使用 for_each 进行提供者迭代。此外,此版本还新增了计划和应用的 -exclude 标志。
我们已尽力确保新的 alpha 版本不会破坏任何功能,但仍需大家的帮助来进行测试。如果你有非生产环境,可以尝试新功能,请务必测试并通过 GitHub 问题[1]反馈给我们,即使只是告诉我们一切都很好。
这篇博客将介绍如何下载新预览版,并详细说明各项新功能的工作原理。
警告
请勿在生产项目上测试此版本!这不是稳定版本!
下载 alpha 版本
alpha 版本仅在 GitHub Releases 页面[2]提供。请根据你的平台选择合适的文件。以下是一些快速链接:
Platform/Device | Download link |
---|---|
Desktop Windows computer (64-bit) | tofu_1.9.0-alpha2_windows_amd64.zip[3] |
MacOS (Macbook M1 or higher; ARM64) | tofu_1.9.0-alpha2_darwin_arm64.tar.gz[4] |
MacOS (Macbook pre-M1; AMD64) | tofu_1.9.0-alpha2_darwin_amd64.tar.gz[5] |
Intel/AMD Linux computer or server (AMD64) | tofu_1.9.0-alpha2_linux_amd64.tar.gz[6] |
ARM-based Linux computer or Raspberry Pi 3 or higher (ARM64) | tofu_1.9.0-alpha2_linux_arm64.tar.gz[7] |
对于上述版本,请解压缩文件,你应该能找到 tofu 二进制文件。你也可以使用独立安装程序[8]下载带有签名验证的版本。
提供者 for_each
假设你需要使用云提供商在多个区域部署基础设施。为了减少代码重复,你创建了一个可以在每个区域使用的模块。然而,你的主模块仍然看起来像这样:
provider "aws" {
alias = "useast"
region = "us-east-1"
}
provider "aws" {
alias = "uswest"
region = "us-west-1"
}
provider "aws" {
alias = "eucentral"
region = "eu-central-1"
}
module "deploy-useast" {
source = "./deploy"
providers = {
aws = aws.useast
}
}
module "deploy-uswest" {
source = "./deploy"
providers = {
aws = aws.uswest
}
}
module "deploy-eucentral" {
source = "./deploy"
providers = {
aws = aws.eucentral
}
}
从 OpenTofu 1.9 开始,你可以使用 for_each 进行替代:
variable "regions" {
description = "A list of regions that should have a deployment."
type = set(string)
}
variable "disabled_regions" {
description = "A list of regions that should be disabled and all resources removed."
type = set(string)
default = []
}
provider "aws" {
alias = "by_region"
region = each.value
for_each = var.regions
}
module "deploy" {
source = "./deploy"
providers = {
aws = aws.by_region[each.key]
}
// Here we make sure that all resources from a region are removed
// if the region is disabled. This must be done before removing
// a region entirely.
for_each = setsubtract(var.regions, var.disabled_regions)
}
如你所见,你可以使用变量传入区域集,然后根据需要调用模块。
不过,使用 for_each 时有一些重要事项需要注意:
你只能在静态获取的变量和本地变量上使用 for_each。依赖数据源或资源的表达式目前不可用。 如果你已有基础设施已部署,请勿直接从列表中移除提供者,因为这会导致 OpenTofu 无法销毁该区域的基础设施。你需要先移除该基础设施,再从列表中移除提供者。请参考上面的 disabled_regions 变量示例。 目前,每个在 for_each 中使用的提供者必须有别名。由于内部技术原因,不支持没有别名的提供者。 目前无法将一组提供者传递给模块,只能传递单个提供者。
我们正在积极解决这些限制,未来的 OpenTofu 版本将改善这一能力。
在计划和应用中排除
这个标志虽然小,但功能强大:类似于 -target,你现在可以告诉 OpenTofu 在应用配置时忽略某个特定资源。
例如:
tofu plan -exclude=kubernetes_manifest.crds
在这种情况下,OpenTofu 会在计划时忽略 kubernetes_manifest.crds。
提供反馈
感谢你花时间测试这个预览版本。如果你有任何反馈,请通过 GitHub 问题反馈或在 OpenTofu Slack[9] 与我们交流。
GitHub 问题: https://github.com/opentofu/opentofu/issues/new/choose
[2]GitHub Releases 页面: https://github.com/opentofu/opentofu/releases/tag/v1.9.0-alpha2
[3]tofu_1.9.0-alpha2_windows_amd64.zip: https://github.com/opentofu/opentofu/releases/download/v1.9.0-alpha2/tofu_1.9.0-alpha2_windows_amd64.zip
[4]tofu_1.9.0-alpha2_darwin_arm64.tar.gz: https://github.com/opentofu/opentofu/releases/download/v1.9.0-alpha2/tofu_1.9.0-alpha2_darwin_arm64.tar.gz
[5]tofu_1.9.0-alpha2_darwin_amd64.tar.gz: https://github.com/opentofu/opentofu/releases/download/v1.9.0-alpha2/tofu_1.9.0-alpha2_darwin_amd64.tar.gz
[6]tofu_1.9.0-alpha2_linux_amd64.tar.gz: https://github.com/opentofu/opentofu/releases/download/v1.9.0-alpha2/tofu_1.9.0-alpha2_linux_amd64.tar.gz
[7]tofu_1.9.0-alpha2_linux_arm64.tar.gz: https://github.com/opentofu/opentofu/releases/download/v1.9.0-alpha2/tofu_1.9.0-alpha2_linux_arm64.tar.gz
[8]独立安装程序: https://opentofu.org/docs/intro/install/standalone/
[9]Slack: https://opentofu.org/slack/
点击【阅读原文】阅读网站原文。
文章转载自LFAPAC。点击这里阅读原文了解更多。
CNCF概况(幻灯片)
扫描二维码联系我们!
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请关注CNCF微信公众号。