首页 > 解决方案 > Terraform:如何为所有声明的模块提供一个通用输出?

问题描述

我的 terraform 文件中有这样的内容:

主文件

    module "airflow_tenant_one" {
      source = "../modules/airflow_tenant"
      name   = "one-airflow"
      project             = var.project
      cluster_name        = var.cluster_name
      region              = var.region
      kubernetes_endpoint = var.kubernetes_endpoint
      tenant_domain       = "one-airflow.${var.domain_name}"
    }
    
    module "airflow_tenant_two" {
      source = "../modules/airflow_tenant"
      name   = "two-airflow"
      project             = var.project
      cluster_name        = var.cluster_name
      region              = var.region
      kubernetes_endpoint = var.kubernetes_endpoint
      tenant_domain       = "two-airflow.${var.domain_name}"
    }

我怎样才能为所有声明的模块做一个共同的输出?

目前,它看起来像:

输出.tf

    output "chart_name_one" {
      description = "The name of the chart"
      value       = module.airflow_tenant_one.chart_name
    }
    
    output "chart_name_two" {
      description = "The name of the chart"
      value       = module.airflow_tenant_two.chart_name
    }

我问是因为将来我可能会在我的main.tf文件中添加更多模块。为所有这些都提供一个输出声明会更好。

标签: terraform

解决方案


您共享的module块似乎都是基于某些客户端名称系统配置的,因此如果您使用的是 Terraform 0.13.0 或更高版本,则可以使用单个module块来执行此操作。for_each

locals {
  tenants = toset([
    "one",
    "two",
  ])
}

module "airflow_tenant" {
  for_each = local.tenants

  name                = "${each.key}-airflow"
  project             = var.project
  cluster_name        = var.cluster_name
  region              = var.region
  kubernetes_endpoint = var.kubernetes_endpoint
  tenant_domain       = "${each.key}-airflow.${var.domain_name}"
}

output "tenant_chart_names" {
  value = {
    for name, tenant in module.airflow_tenant : name => tenant.chart_name
  }
}

以上将导致 的airflow_tenant每个元素都有一个模块实例local.tenants,地址如下:

  • module.airflow_tenant["one"]
  • module.airflow_tenant["two"]

当您在其他地方引用它时,这for_each使得模块表现为实例映射,这就是为什么我们能够将该映射投影到output "tenant_chart_names"以派生从租户名称到图表名称的映射。

您可以随时间添加和删除元素local.tenants,在这种情况下,Terraform 将理解为创建实例或销毁该模块内描述的所有对象的实例的意图。

您可以在Module 的 Multiple Instances 中阅读有关此功能的更多信息。


推荐阅读