Terraform如何从映射中提取列表指定的环境配置元素?
从Terraform映射中筛选指定环境配置的实现方法
直接用Terraform的for表达式在locals中构建目标映射即可,for_each主要用于资源块的多实例创建,不适合在locals里做数据筛选,这也是你之前出错的原因。
完整实现代码
假设你的原始变量定义如下:
variable "wanted_envs" { type = list(string) default = ["env1", "env2"] } variable "envs" { type = map(object({ type = string backend = string backend_subnet = string k8_pod_subnet = string k8_service_subnet = string gateway_subnet = string dmz = string })) default = { "env1" = { type = "prod" backend = "cust-prod-backend-vpc" backend_subnet = "192.168.0.0/22" k8_pod_subnet = "192.168.35.16.0/20" k8_service_subnet = "192.168.40.0/20" gateway_subnet = "1.2.3.0/27" dmz = "env1" }, "env2" = { type = "prod" backend = "cust-prod-backend-vpc" backend_subnet = "192.168.0.0/22" k8_pod_subnet = "192.168.35.16.0/20" k8_service_subnet = "192.168.40.0/20" gateway_subnet = "1.2.3.0/27" dmz = "env2" }, "env3" = { type = "prod" backend = "cust-prod-backend-vpc" backend_subnet = "192.168.0.0/22" k8_pod_subnet = "192.168.35.16.0/20" k8_service_subnet = "192.168.40.0/20" gateway_subnet = "1.2.3.0/27" dmz = "env3" } } }
在locals中定义目标映射:
locals { envs_to_build = { for env_name in var.wanted_envs : env_name => var.envs[env_name] } }
容错处理(可选)
如果担心wanted_envs中存在envs里没有的环境名称,可以添加条件判断自动过滤无效项,避免键不存在的错误:
locals { envs_to_build = { for env_name in var.wanted_envs : env_name => var.envs[env_name] if contains(keys(var.envs), env_name) } }
内容的提问来源于stack exchange,提问作者djsmiley2kStaysInside
相关产品推荐
相关产品推荐

