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