Skip to content

1. output

1.1 使用说明✅

output 可以打印已定义的变量,并且可以公开信息以供其他 Terraform 配置使用。输出值类似于编程语言中的返回值。

terraform output 命令被用来提取状态文件中输出值的值。

声明

输出值的声明使用输出块,例如:

hcl
output "instance_ip_addr" {
  value = aws_instance.server.private_ip
}
output "instance_ip_addr" {
  value = aws_instance.server.private_ip
}

output 关键字后紧跟的就是输出值的名称。在当前模块内的所有输出值的名字都必须是唯一的。output 块内的 value 参数即为输出值,它可以像是上面的例子里那样某个 resource 的输出属性,也可以是任意合法的表达式。

1.2 用法✅

terraform output [options] [NAME]
terraform output [options] [NAME]

如果不添加参数,output 命令会展示根模块内定义的所有输出值。如果指定了 NAME,只会输出相关输出值。

可以使用以下参数:

  • -json:设置该参数后 Terraform 会使用 JSON 格式输出。如果指定了 NAME,只会输出相关输出值。该参数搭配 jq 使用可以构建复杂的流水线

image-20250710215609952

  • -raw:设置该参数后 Terraform 会将指定的输出值转换为字符串,并将该字符串直接打印到输出中,不带任何特殊格式。这在使用 shell 脚本时很方便,但它仅支持字符串、数字和布尔值。处理复杂的数据类型时还请使用 -json

image-20250710215737848

  • -no-color:不输出颜色
  • -state=path:状态文件的路径,默认为 terraform.tfstate。启用远程 Backend 时该参数无效

使用-json和jq查询指定主机的ip

bash
$ terraform output -json ecs_public_ip | jq
$ terraform output -json ecs_public_ip | jq

1.3 案例

输出值-官当

vim outputs.tf

yaml
output "ecs_public_ip" {
  value=alicloud_instance.instance.public_ip
  description = "this is instance public ip"
}
output "ecs_public_ip" {
  value=alicloud_instance.instance.public_ip
  description = "this is instance public ip"
}

通过 . 获取值

image-20250710214236526

❌ 注意

  • 在运行terraform apply后,根模块会在终端中打印输出值。
  • 输出值只有在执行terraform apply后才会被计算,使用terraform plan并不会计算输出值。
  • 子模块可以使用输出将其资源属性的子集暴露给父模块。
  • 子模块的output.tf只会应用到本层级中,不会传递到根目录。若需要传递到根目录,需要在根目录的output.tf文件中定义块引用子层级中的output.tf中的值。通过两次输出,使得主文件中的output变量能够输出到命令行中。