- OpenTofu 语言
- 状态
- terraform_remote_state 数据源
terraform_remote_state
数据源
terraform_remote_state
数据源使用来自指定状态后端的最新状态快照来检索其他 OpenTofu 配置的根模块输出值。
您可以使用 terraform_remote_state
数据源,而无需要求或配置提供者。它始终通过具有 源地址 terraform.io/builtin/terraform
的内置提供者提供。该提供者不包含任何其他资源或数据源。
在配置之间共享数据的替代方法
使用根模块输出共享数据很方便,但它有缺点。虽然 terraform_remote_state
只暴露输出值,但其用户必须访问整个状态快照,其中通常包含一些敏感信息。
只要可能,我们建议将数据明确发布到单独的位置以供外部使用,而不是通过远程状态访问它。这样您就可以对共享信息和状态快照应用不同的访问控制。
要在配置之间明确共享数据,可以使用各种提供者中的受管资源类型和数据源对,包括(但不限于)以下内容
系统 | 使用... 发布 | 使用... 读取 |
---|---|---|
阿里云 DNS (用于 IP 地址和主机名) | alicloud_alidns_record 资源类型 | 正常 DNS 查找,或 dns 提供者 |
亚马逊 Route 53 (用于 IP 地址和主机名) | aws_route53_record 资源类型 | 正常 DNS 查找,或 dns 提供者 |
亚马逊 S3 | aws_s3_object 资源类型 | aws_s3_object 数据源 |
亚马逊 SSM 参数存储 | aws_ssm_parameter 资源类型 | aws_ssm_parameter 数据源 |
Azure 自动化 | azurerm_automation_variable_string 资源类型 | azurerm_automation_variable_string 数据源 |
Azure DNS (用于 IP 地址和主机名) | azurerm_dns_a_record 资源类型 等 | 正常 DNS 查找,或 dns 提供者 |
Google Cloud DNS (用于 IP 地址和主机名) | google_dns_record_set 资源类型 | 正常 DNS 查找,或 dns 提供者 |
Google Cloud Storage | google_storage_bucket_object 资源类型 | google_storage_bucket_object 数据源 和 http 数据源 |
HashiCorp Consul | consul_key_prefix 资源类型 | consul_key_prefix 数据源 |
HashiCorp Terraform Cloud | 正常 outputs terraform 块 | tfe_outputs 数据源 |
Kubernetes | kubernetes_config_map 资源类型 | kubernetes_config_map 数据源 |
OCI 对象存储 | oci_objectstorage_bucket 资源类型 | oci_objectstorage_bucket 数据源 |
这些是官方 OpenTofu 提供者中的一些常见选项,但这里列出的配置存储选项太多,包括合作伙伴和社区提供者中的一些。任何受管资源类型和相应数据源对都可以潜在地用于在 OpenTofu 配置之间共享数据。请参阅各个提供者文档以查找其他可能性。
与使用 terraform_remote_state
相比,使用单独的显式配置存储的一个主要优点是,数据可能还可以被除 OpenTofu 之外的其他系统读取,例如您计算实例中的配置管理或调度系统。因此,我们建议选择您的其他基础设施可能利用的配置存储。例如
- 如果您希望共享 IP 地址和主机名,您可以将它们发布为私有 DNS 区域中的正常 DNS
A
、AAAA
、CNAME
和SRV
记录,然后配置您的其他基础设施以引用该区域,以便您可以通过系统的内置 DNS 解析器找到基础设施对象。 - 如果您使用 HashiCorp Consul,那么将数据发布到 Consul 键值存储或 Consul 服务目录可以使该数据也可以通过 Consul Template 或 HashiCorp Nomad
template
节访问。 - 如果您使用 Kubernetes,那么您可以 使 Config Maps 可用于您的 Pod。
上面列出的一些数据存储专门用于存储小的配置值,而另一些则是通用的 Blob 存储系统。对于那些通用系统,您可以分别使用 jsonencode
函数 和 jsondecode
函数 来存储和检索结构化数据。
您可以通过编写一个包含必要数据源配置和任何必要的后处理(例如 JSON 解码)的 仅数据模块 来封装检索已发布配置数据的实现细节。如果切换到不同的策略来在多个 OpenTofu 配置之间共享数据,您可以在以后更改该模块。
示例用法(remote
后端)
data "terraform_remote_state" "vpc" {
backend = "remote"
config = {
organization = "hashicorp"
workspaces = {
name = "vpc-prod"
}
}
}
resource "aws_instance" "foo" {
# ...
subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}
示例用法(local
后端)
data "terraform_remote_state" "vpc" {
backend = "local"
config = {
path = "..."
}
}
resource "aws_instance" "foo" {
# ...
subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}
参数参考
支持以下参数
-
backend
- (必需) 要使用的远程后端。 -
workspace
- (可选) 要使用的 OpenTofu 工作区,如果后端支持工作区。 -
config
- (可选; 对象) 远程后端的配置。尽管此参数被列为可选,但大多数后端都需要一些配置。config
对象可以使用在等效的terraform { backend "<TYPE>" { ... } }
块中有效的任何参数。有关详细信息,请参阅 您选择的后端的文档。注意如果后端配置需要嵌套块,请在此处将其指定为具有对象值的正常属性。(例如,
workspaces = { ... }
而不是workspaces { ... }
。) -
defaults
- (可选; 对象) 输出的默认值,以防状态文件为空或缺少必需的输出。
属性参考
除了以上内容外,还导出了以下属性
outputs
- 一个对象,其中包含远程状态中每个根级 输出。
仅根输出
仅公开来自远程状态快照的根级输出值,以便在您的模块中的其他地方使用。资源数据和来自嵌套模块的输出值不可访问。
如果您希望将嵌套模块输出值作为根模块输出值访问,则必须在根模块中显式配置一个传递。例如
例如
module "app" {
source = "..."
}
output "app_value" {
value = module.app.example
}
在此示例中,来自“app”模块的名为 example
的输出值可作为 app_value
根模块输出值访问。如果此配置不包含 output "app_value"
块,则该数据将无法通过 terraform_remote_state
访问。
尽管 terraform_remote_state
不公开任何其他状态快照信息以供在配置中使用,但状态快照数据是一个单独的对象,因此任何有足够权限读取根模块输出值的 用户或服务器也始终可以通过直接网络请求访问完整的状态快照数据。如果您的配置中的任何资源使用您认为敏感的数据,请不要使用 terraform_remote_state
。