如何解决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
文件中添加更多模块。最好对所有这些都使用一个输出声明。
解决方法
您共享的module
块似乎都是根据某些客户端名称进行系统配置的,因此,如果您使用的是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
}
}
Terraform 0.13.0或更高版本。
airflow_tenant
以上内容将导致local.tenants
的每个元素有一个module.airflow_tenant["one"]
模块的实例,其地址如下:
-
module.airflow_tenant["two"]
-
for_each
output "tenant_chart_names"
使模块在您在其他位置引用时,其行为像实例图一样,这就是为什么我们能够在local.tenants
中投影该图以将图从租户名称派生到图表名称。
您可以随着时间的推移添加和删除resource "aws_api_gateway_integration" "integration" {
count = var.lambda_definition.apigateway ? 1 : 0
rest_api_id = "${data.terraform_remote_state.apigateway.outputs.apigateway_id}"
resource_id = aws_api_gateway_resource.api_proxy_resource[count.index].id
http_method = "${aws_api_gateway_method.method[count.index].http_method}"
integration_http_method = "ANY"
type = "AWS_PROXY"
uri = aws_lambda_function.lambda.invoke_arn
}
的元素,在这种情况下,Terraform会理解为创建该实例或销毁该模块中描述的所有对象的实例。
您可以在Multiple Instances of a Module中了解有关此功能的更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。