如何用Terraform动态创建供模块调用的映射结构?
动态创建Terraform映射结构及模块调用方法
方法一:直接通过range生成目标映射
可以跳过中间的test_items列表,直接用for表达式一步生成所需的映射结构,语法更简洁:
locals { test_count = 90 custom_items = { for i in range(local.test_count) : format("test%02d", i+1) => { name = "${format("test%02d", i+1)}shared value" # 也可使用concat函数:concat(format("test%02d", i+1), "shared value") } } }
这里的核心是Terraform的映射型for表达式:for <元素> in <集合> : <键> => <值>,直接将循环变量i转换为testXX格式的键,同时生成包含name字段的对象作为对应值。
方法二:基于已有的test_items列表生成映射
如果需要保留test_items列表复用,可以基于它来生成目标映射:
locals { test_count = 90 test_items = [for i in range(local.test_count) : format("test%02d", i+1)] custom_items = { for item in local.test_items : item => { name = "${item}shared value" # 或使用concat(item, "shared value") } } }
此方式直接遍历test_items中的每个元素,将元素本身作为映射的键,同时生成对应的对象值,逻辑更直观。
用for_each动态调用模块
得到custom_items后,即可通过for_each遍历这个映射,动态创建模块实例:
module "test_modules" { source = "./path/to/your/module" for_each = local.custom_items # 向模块传递参数,比如name字段 name = each.value.name # 若需使用键名,可调用each.key # test_identifier = each.key }
for_each会以custom_items的每个键值对为依据,创建独立的模块实例,each.key对应test01/test02这类标识,each.value则是对应的对象结构。
内容的提问来源于stack exchange,提问作者TheDemonLord
相关产品推荐
相关产品推荐

