- OpenTofu 语言
- OpenTofu 设置
- 后端
- 后端配置
后端配置
后端定义了 OpenTofu 在哪里存储其 状态 数据文件。
OpenTofu 使用持久化的状态数据来跟踪它管理的资源。大多数非平凡的 OpenTofu 配置要么与 TACOS(TF 自动化和协作软件)集成,要么使用后端远程存储状态。这允许多个人访问状态数据并共同处理该基础设施资源集合。
本页介绍了如何通过在配置中添加 backend
块 来配置后端。
可用后端
默认情况下,OpenTofu 使用名为 local
的后端,该后端将状态存储为磁盘上的本地文件。您还可以配置本文档中包含的内置后端之一。
其中一些后端充当状态文件的纯远程磁盘,而另一些则支持在执行操作时锁定状态。这有助于防止冲突和不一致。列出的内置后端是唯一的后端。您无法将其他后端加载为插件。
使用后端块
使用 TACOS(TF 自动化和协作软件)时,您无需配置后端,因为它会自动管理与您的配置关联的工作空间中的状态。如果您的配置包含 cloud
块,则它不能包含 backend
块。
要配置后端,请在顶层 terraform
块中添加一个嵌套的 backend
块。以下示例配置了 remote
后端。
terraform {
backend "remote" {
organization = "example_corp"
workspaces {
name = "my-app-prod"
}
}
}
后端配置有一些重要的限制
- 配置只能提供一个后端块。
- 后端块不能引用来自状态(数据源属性)的状态或局部变量中派生的值。
凭据和敏感数据
后端将状态存储在远程服务中,这允许多个人访问它。访问远程状态通常需要访问凭据,因为状态数据包含极其敏感的信息。
建议使用环境变量来提供凭据和其他敏感数据。如果您使用 -backend-config
或直接在配置中硬编码这些值,OpenTofu 将在 .terraform
子目录和计划文件中包含这些值。这可能会泄露敏感凭据。
OpenTofu 将后端配置以纯文本形式写入两个单独的文件中。
.terraform/terraform.tfstate
文件包含当前工作目录的后端配置。- 所有计划文件都会捕获在创建计划时
.terraform/terraform.tfstate
中的信息。这有助于确保 OpenTofu 将计划应用到正确的基础设施集。
在应用之前保存到文件的计划时,OpenTofu 会使用存储在该文件中的后端配置,而不是当前的后端设置。如果该配置包含有限时凭据,则它们可能在您完成应用计划之前过期。使用环境变量在需要在计划和应用步骤之间使用不同值时传递凭据。
后端类型
后端块的块标签(上面的示例中为 "remote"
)指示要使用的后端类型。OpenTofu 有一组内置的后端,您配置的后端必须在您使用的 OpenTofu 版本中可用。
块主体中使用的参数特定于所选的后端类型;它们配置后端将状态存储在何处以及如何存储,并在某些情况下配置其他行为。
一些后端允许直接在配置中提供访问凭据以供在非寻常情况下出于实际原因使用。但是,在正常使用中,我们不建议将访问凭据包含在后端配置中。相反,请将这些参数完全保留为空,并使用针对目标系统常规的凭据文件或环境变量提供凭据,如每个后端的文档中所述。
请参阅每个后端类型的页面以获取完整的详细信息以及该类型的配置参数。
默认后端
如果配置不包含后端块,则 OpenTofu 默认使用 local
后端,该后端将状态存储为当前工作目录中的普通文件。
初始化
更改后端的配置后,您必须再次运行 tofu init
来验证和配置后端,然后才能执行任何计划、应用或状态操作。
初始化后,OpenTofu 会在本地创建一个 .terraform/
目录。该目录包含最新的后端配置,包括您提供给 OpenTofu CLI 的任何身份验证参数。请勿将此目录检入 Git,因为它可能包含您远程后端的敏感凭据。
本地后端配置不同于包含 状态数据 的 terraform.tfstate
文件,该文件包含有关您实际基础设施的信息。OpenTofu 将 terraform.tfstate
文件存储在您的远程后端。
当您更改后端时,OpenTofu 会为您提供将状态迁移到新后端的选项。这使您能够采用后端,而不会丢失任何现有状态。
在迁移到新后端之前,我们强烈建议您通过将 terraform.tfstate
文件复制到另一个位置来手动备份您的状态。
部分配置
您无需在后端配置中指定所有必需参数。如果某些参数由运行 OpenTofu 的自动化脚本自动提供,则可能希望省略某些参数。当部分或全部参数被省略时,我们将其称为部分配置。
对于部分配置,剩余的配置参数必须作为 初始化过程 的一部分提供。
有多种方法可以提供剩余的参数
-
文件:可以通过
init
命令行指定配置文件。要指定文件,请在运行tofu init
时使用-backend-config=PATH
选项。如果文件包含秘密信息,则可以将其保存在安全数据存储中,例如 Vault,在这种情况下,必须在运行 OpenTofu 之前将其下载到本地磁盘。 -
命令行键值对:可以通过
init
命令行指定键值对。请注意,许多 shell 会将命令行标志保留在历史记录文件中,因此不建议对秘密信息使用此方法。要指定单个键值对,请在运行tofu init
时使用-backend-config="KEY=VALUE"
选项。 -
交互式:OpenTofu 会以交互方式向您索要所需的值,除非交互式输入被禁用。OpenTofu 不会提示您输入可选值。
如果后端设置在多个位置提供,则会合并顶层设置,以便任何命令行选项都会覆盖主配置中的设置,然后会按顺序处理命令行选项,后面的选项会覆盖前面选项设置的值。
最终合并的配置会存储在磁盘上的 .terraform
目录中,该目录应该从版本控制中忽略。这意味着敏感信息可以从版本控制中省略,但在运行 OpenTofu 时会以纯文本形式存在于本地磁盘上。
当使用部分配置时,OpenTofu 至少要求在根 OpenTofu 配置文件中指定一个空的后台配置,以指定后端类型。例如
terraform {
backend "consul" {}
}
文件
后端配置文件包含 backend
块的内容作为顶层属性,无需将其包装在另一个 tofu
或 backend
块中
address = "demo.consul.io"
path = "example_app/terraform_state"
scheme = "https"
*.backendname.tfbackend
(例如 config.consul.tfbackend
)是推荐的命名模式。OpenTofu 不会阻止您使用其他名称,但遵循此约定将有助于您的编辑器理解内容,并可能因此提供更好的编辑体验。
命令行键值对
可以使用以下方法在命令行上指定相同的设置
$ tofu init \
-backend-config="address=demo.consul.io" \
-backend-config="path=example_app/terraform_state" \
-backend-config="scheme=https"
Consul 后端还需要一个 Consul 访问令牌。根据上述建议,即从配置中省略凭据并使用其他机制,可以通过设置 CONSUL_HTTP_TOKEN
或 CONSUL_HTTP_AUTH
环境变量来提供 Consul 令牌。请参阅您选择的后台的文档,了解如何在后台的主要配置之外向其提供凭据。
变量和局部变量
您可以在后端配置中使用变量和局部变量(存在限制)。后端配置可能不包含对状态或提供程序定义的函数的任何引用。所有值必须能够在 tofu init
期间解析,在状态可用之前。
我们建议不要使用变量在后端配置中指定秘密或其他敏感数据。如果配置不当,这会导致敏感凭据泄露。
locals {
region = "us-east-1"
}
terraform {
backend "s3" {
region = local.region
}
}
更改配置
您可以随时更改后端配置。您可以更改配置本身以及后端类型(例如,从“consul”更改为“s3”)。
OpenTofu 会自动检测配置中的任何更改,并请求 重新初始化。作为重新初始化过程的一部分,OpenTofu 会询问您是否要将现有状态迁移到新配置。这使您可以轻松地从一个后端切换到另一个后端。
如果您使用多个 工作区,OpenTofu 可以将所有工作区复制到目标位置。如果 OpenTofu 检测到您有多个工作区,它会询问您是否要执行此操作。
如果您只是重新配置同一个后端,OpenTofu 仍然会询问您是否要迁移状态。您可以在这种情况下回答“否”。
取消配置后端
如果您不再想要使用任何后端,只需从文件中删除配置即可。OpenTofu 会像检测其他任何更改一样检测到此更改,并提示您 重新初始化。
作为重新初始化的一部分,OpenTofu 会询问您是否要将状态迁移回正常的本地状态。完成此操作后,OpenTofu 会恢复到默认的行为方式。