Terraform: как я могу иметь один общий вывод для всех объявленных модулей?

#terraform

#terraform

Вопрос:

У меня есть что-то вроде этого в моем файле terraform:

main.tf

     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}"
    }
  

Как я могу сделать один общий вывод для всех объявленных модулей?

В настоящее время это выглядит так:

outputs.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 файл. Будет лучше иметь одно объявление вывода для всех из них.

Комментарии:

1. Вы имеете в виду динамически? Или просто, если вы добавляете модуль, вы также можете пойти и отредактировать вывод одновременно?

2. Вы могли бы сделать ` value = [module.airflow_tenant_one.chart_name, module.airflow_tenant_two.chart_name ]`, но неясно, к чему вы на самом деле стремитесь.

3. ДА. Я хотел бы сделать динамически. Я не хочу добавлять все исходящие данные, когда я добавлю новый модуль.

Ответ №1:

Похоже, что все module блоки, которыми вы поделились, систематически настроены на основе некоторых имен клиентов, поэтому вы потенциально можете сделать это, используя один module блок с for_each , если вы используете Terraform 0.13.0 или более позднюю версию.

 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 поймет это как намерение либо создать экземпляры, либо уничтожить экземпляры всех объектов, описанных внутри этого модуля.

Вы можете прочитать больше об этой функции в нескольких экземплярах модуля.