Terraform 输出值 #
什么是输出值? #
输出值(Output)是 Terraform 的一种机制,用于从配置中导出数据。输出值可以在执行后显示给用户,也可以在模块间传递数据。
text
┌─────────────────────────────────────────────────────────────┐
│ 输出值的作用 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 显示信息 │ │ 模块通信 │ │ 远程状态 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ - 执行后显示重要信息 │
│ - 模块间传递数据 │
│ - 其他配置引用 │
│ │
└─────────────────────────────────────────────────────────────┘
输出值定义 #
基本语法 #
hcl
output "<NAME>" {
value = <EXPRESSION>
}
输出参数 #
hcl
output "instance_ip" {
description = "The public IP of the EC2 instance"
value = aws_instance.example.public_ip
sensitive = false
depends_on = [aws_eip.example]
}
参数说明 #
text
┌─────────────────────────────────────────────────────────────┐
│ 输出参数 │
├─────────────────────────────────────────────────────────────┤
│ │
│ value 输出值(必需) │
│ description 输出描述 │
│ sensitive 是否敏感(默认 false) │
│ depends_on 显式依赖 │
│ precondition 前置条件检查 │
│ │
└─────────────────────────────────────────────────────────────┘
基本输出 #
输出资源属性 #
hcl
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
output "instance_id" {
value = aws_instance.example.id
}
output "instance_public_ip" {
value = aws_instance.example.public_ip
}
output "instance_private_ip" {
value = aws_instance.example.private_ip
}
输出计算值 #
hcl
variable "environment" {
default = "dev"
}
output "environment_name" {
value = "Environment: ${upper(var.environment)}"
}
output "resource_count" {
value = length(aws_instance.example)
}
输出复杂结构 #
hcl
output "instance_info" {
value = {
id = aws_instance.example.id
public_ip = aws_instance.example.public_ip
private_ip = aws_instance.example.private_ip
tags = aws_instance.example.tags
}
}
output "all_instance_ips" {
value = {
for instance in aws_instance.web : instance.tags.Name => instance.public_ip
}
}
查看输出 #
apply 后查看 #
bash
terraform apply
Outputs:
instance_id = "i-1234567890abcdef0"
instance_public_ip = "54.123.45.67"
output 命令 #
bash
terraform output
输出:
text
instance_id = "i-1234567890abcdef0"
instance_public_ip = "54.123.45.67"
查看单个输出 #
bash
terraform output instance_public_ip
输出:
text
"54.123.45.67"
JSON 格式输出 #
bash
terraform output -json
输出:
json
{
"instance_id": {
"value": "i-1234567890abcdef0",
"type": "string"
},
"instance_public_ip": {
"value": "54.123.45.67",
"type": "string"
}
}
原始值输出 #
bash
terraform output -raw instance_public_ip
输出:
text
54.123.45.67
敏感输出 #
标记敏感输出 #
hcl
output "db_password" {
value = var.db_password
sensitive = true
}
output "api_key" {
value = aws_secretsmanager_secret_version.api_key.secret_string
sensitive = true
}
查看敏感输出 #
bash
terraform output
输出:
text
db_password = <sensitive>
api_key = <sensitive>
显示敏感输出 #
bash
terraform output -json | jq -r '.db_password.value'
模块输出 #
模块定义输出 #
hcl
module "vpc" {
source = "./modules/vpc"
vpc_cidr = "10.0.0.0/16"
}
output "vpc_id" {
value = module.vpc.vpc_id
}
output "subnet_ids" {
value = module.vpc.subnet_ids
}
模块内部输出 #
hcl
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
}
resource "aws_subnet" "public" {
count = length(var.public_subnet_cidrs)
vpc_id = aws_vpc.main.id
cidr_block = var.public_subnet_cidrs[count.index]
}
output "vpc_id" {
value = aws_vpc.main.id
}
output "subnet_ids" {
value = aws_subnet.public[*].id
}
output "vpc_cidr" {
value = aws_vpc.main.cidr_block
}
访问模块输出 #
hcl
module "vpc" {
source = "./modules/vpc"
}
resource "aws_instance" "web" {
subnet_id = module.vpc.subnet_ids[0]
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
output "network_info" {
value = {
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.subnet_ids
}
}
条件输出 #
条件判断 #
hcl
variable "create_instance" {
default = true
}
output "instance_ip" {
value = var.create_instance ? aws_instance.example[0].public_ip : "No instance created"
}
resource "aws_instance" "example" {
count = var.create_instance ? 1 : 0
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
可选输出 #
hcl
output "instance_ip" {
value = try(aws_instance.example[0].public_ip, null)
}
前置条件 #
使用 precondition #
hcl
output "instance_ip" {
value = aws_instance.example.public_ip
precondition {
condition = aws_instance.example.instance_state == "running"
error_message = "Instance must be in running state."
}
}
多条件检查 #
hcl
output "vpc_info" {
value = {
id = aws_vpc.main.id
cidr = aws_vpc.main.cidr_block
}
precondition {
condition = tonumber(split("/", aws_vpc.main.cidr_block)[1]) >= 16
error_message = "VPC CIDR block must be /16 or larger."
}
precondition {
condition = aws_vpc.main.enable_dns_support == true
error_message = "DNS support must be enabled."
}
}
输出最佳实践 #
命名规范 #
hcl
output "vpc_id" {
}
output "public_subnet_ids" {
}
output "instance_private_ip" {
}
output "alb_dns_name" {
}
添加描述 #
hcl
output "vpc_id" {
description = "The ID of the VPC"
value = aws_vpc.main.id
}
output "instance_public_ip" {
description = "The public IP address of the EC2 instance"
value = aws_instance.example.public_ip
}
分组输出 #
hcl
output "network" {
description = "Network information"
value = {
vpc_id = aws_vpc.main.id
vpc_cidr = aws_vpc.main.cidr_block
subnet_ids = aws_subnet.public[*].id
}
}
output "compute" {
description = "Compute resources"
value = {
instance_ids = aws_instance.web[*].id
public_ips = aws_instance.web[*].public_ip
}
}
output "database" {
description = "Database information"
value = {
endpoint = aws_db_instance.main.endpoint
port = aws_db_instance.main.port
name = aws_db_instance.main.db_name
}
}
文件组织 #
text
project/
├── main.tf
├── variables.tf
├── outputs.tf 输出定义
└── modules/
└── vpc/
├── main.tf
├── variables.tf
└── outputs.tf 模块输出
输出示例 #
VPC 模块输出 #
hcl
output "vpc_id" {
description = "The ID of the VPC"
value = aws_vpc.main.id
}
output "vpc_cidr_block" {
description = "The CIDR block of the VPC"
value = aws_vpc.main.cidr_block
}
output "public_subnet_ids" {
description = "List of public subnet IDs"
value = aws_subnet.public[*].id
}
output "private_subnet_ids" {
description = "List of private subnet IDs"
value = aws_subnet.private[*].id
}
output "nat_gateway_public_ips" {
description = "List of NAT Gateway public IPs"
value = aws_eip.nat[*].public_ip
}
output "internet_gateway_id" {
description = "The ID of the Internet Gateway"
value = aws_internet_gateway.main.id
}
EC2 实例输出 #
hcl
output "instance_ids" {
description = "List of instance IDs"
value = aws_instance.web[*].id
}
output "public_ips" {
description = "List of public IP addresses"
value = aws_instance.web[*].public_ip
}
output "private_ips" {
description = "List of private IP addresses"
value = aws_instance.web[*].private_ip
}
output "instance_dns" {
description = "List of public DNS names"
value = aws_instance.web[*].public_dns
}
RDS 数据库输出 #
hcl
output "db_endpoint" {
description = "The endpoint of the RDS instance"
value = aws_db_instance.main.endpoint
}
output "db_name" {
description = "The database name"
value = aws_db_instance.main.db_name
}
output "db_username" {
description = "The database username"
value = aws_db_instance.main.username
sensitive = true
}
output "db_port" {
description = "The database port"
value = aws_db_instance.main.port
}
output "db_instance_id" {
description = "The RDS instance identifier"
value = aws_db_instance.main.id
}
完整示例 #
hcl
output "environment" {
description = "Deployment environment"
value = var.environment
}
output "vpc" {
description = "VPC information"
value = {
id = module.vpc.vpc_id
cidr_block = module.vpc.vpc_cidr_block
public_subnets = module.vpc.public_subnet_ids
private_subnets = module.vpc.private_subnet_ids
}
}
output "web_servers" {
description = "Web server information"
value = {
ids = module.web.instance_ids
public_ips = module.web.public_ips
private_ips = module.web.private_ips
}
}
output "database" {
description = "Database information"
value = {
endpoint = module.database.db_endpoint
port = module.database.db_port
name = module.database.db_name
}
sensitive = true
}
output "load_balancer" {
description = "Load balancer information"
value = {
dns_name = module.alb.dns_name
zone_id = module.alb.zone_id
}
}
output "connection_strings" {
description = "Connection strings for services"
value = {
web_url = "http://${module.alb.dns_name}"
db_endpoint = module.database.db_endpoint
}
}
下一步 #
掌握了输出值后,接下来学习 本地值,了解如何定义和使用本地值来简化配置!
最后更新:2026-03-29