跳至主要内容

输出值

输出值使您基础设施的信息在命令行上可用,并且可以公开信息供其他 OpenTofu 配置使用。输出值类似于编程语言中的返回值。

输出值有多种用途

  • 子模块可以使用输出将其实现资源属性的子集公开给父模块。
  • 根模块可以使用输出在运行 tofu apply 后在 CLI 输出中打印某些值。
  • 当使用 远程状态 时,其他配置可以通过 terraform_remote_state 数据源 访问根模块输出。

OpenTofu 管理的每个资源实例都会导出其值可以在配置的其他地方使用的属性。输出值是一种将其中一些信息公开给模块用户的方式。

声明输出值

模块导出的每个输出值都必须使用 output 块声明

代码块
output "instance_ip_addr" {
value = aws_instance.server.private_ip
}

output 关键字后的标签是名称,它必须是有效的 标识符。在根模块中,此名称显示给用户;在子模块中,它可以用于访问输出的值。

value 参数采用一个 表达式,其结果将返回给用户。在此示例中,表达式引用了由在此模块中其他地方定义的 aws_instance 资源(未显示)公开的 private_ip 属性。任何有效的表达式都允许作为输出值。

访问子模块输出

在父模块中,子模块的输出在表达式中可用,格式为 module.<MODULE NAME>.<OUTPUT NAME>。例如,如果名为 web_server 的子模块声明了一个名为 instance_ip_addr 的输出,则可以将其值访问为 module.web_server.instance_ip_addr

自定义条件检查

您可以使用 precondition 块来指定有关输出数据的保证。以下示例创建了一个前提条件,用于检查 EC2 实例是否具有加密的根卷。

代码块
output "api_base_url" {
value = "https://${aws_instance.example.private_dns}:8433/"

# The EC2 instance must have an encrypted root volume.
precondition {
condition = data.aws_ebs_volume.example.encrypted
error_message = "The server's root volume is not encrypted."
}
}

自定义条件可以帮助捕获假设,帮助未来的维护人员了解配置设计和意图。它们还可以更早地在上下文中返回有关错误的有用信息,帮助使用者更轻松地诊断其配置中的问题。

有关更多详细信息,请参阅 自定义条件检查

可选参数

output 块可以选择包含 descriptionsensitivedepends_on 参数,这些参数将在以下部分中进行描述。

description — 输出值文档

由于模块的输出值是其用户界面的一部分,因此您可以使用可选的 description 参数简要描述每个值的目的

代码块
output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "The private IP address of the main server instance."
}

输出的描述应简洁地解释输出的目的以及预期值的类型。此描述字符串可能会包含在模块的相关文档中,因此应从模块用户的角度而不是维护者的角度编写。对于模块维护者的注释,请使用注释。

sensitive — 在 CLI 输出中隐藏值

可以使用可选的 sensitive 参数将输出标记为包含敏感信息。

代码块
output "db_password" {
value = aws_db_instance.db.password
description = "The password for logging in to the database."
sensitive = true
}

OpenTofu 会在 tofu plantofu apply 的消息中隐藏标记为敏感的值。在以下场景中,我们的根模块声明了一个敏感的输出,以及一个包含敏感输出的模块调用,然后我们在资源属性中使用它。

代码块
# main.tf

module "foo" {
source = "./mod"
}

resource "test_instance" "x" {
some_attribute = module.foo.a # resource attribute references a sensitive output
}

output "out" {
value = "xyz"
sensitive = true
}

# mod/main.tf, our module containing a sensitive output

output "a" {
value = "secret"
sensitive = true
}

当我们运行计划或应用时,敏感值会被从输出中删除。

代码块
OpenTofu will perform the following actions:

# test_instance.x will be created
+ resource "test_instance" "x" {
+ some_attribute = (sensitive value)
}

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
+ out = (sensitive value)

OpenTofu 仍会将敏感值记录在 状态 中,因此任何可以访问状态数据的人都可以以明文方式访问敏感值。有关更多信息,请参阅 状态中的敏感数据

depends_on — 显式输出依赖项

由于输出值只是将数据传递出模块的一种方式,因此通常无需担心它们与依赖关系图中其他节点的关系。

但是,当父模块访问其子模块之一导出的输出值时,该输出值的依赖项允许 OpenTofu 正确确定在不同模块中定义的资源之间的依赖关系。

资源依赖项 一样,OpenTofu 会分析输出值的 value 表达式并自动确定一组依赖项,但在不太常见的情况下,存在无法隐式识别的依赖项。在这些罕见的情况下,可以使用 depends_on 参数创建其他显式依赖项。

代码块
output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "The private IP address of the main server instance."

depends_on = [
# Security group rule must be created before this IP address could
# actually be used, otherwise the services will be unreachable.
aws_security_group_rule.local_access,
]
}

depends_on 参数应仅作为最后手段使用。使用它时,始终包含一个注释来解释使用它的原因,以帮助未来的维护者理解额外依赖项的目的。