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