如何在Terraform的for_each循环中自动递增priority参数
在Terraform的for_each循环中实现自动递增的priority值
要在不修改原inbound_mgmt映射结构的前提下,让priority从1000开始每次迭代自动加1,核心是给每个映射元素分配一个稳定的递增索引,具体可以通过以下两种方式实现:
方式一:生成带索引的局部映射(推荐)
先通过for表达式为原映射的每个元素添加一个稳定的索引,再在资源中引用该索引计算优先级:
locals { inbound_mgmt = { ## List of Locations/sites needing to access the management interface "HQ" = {ip = "1.2.3.4/24"}, "SITE1" = {ip = "3.4.5.6/29"}, "SITE2" = {ip = "6.7.8.9/29"} } # 生成带递增索引的新映射,先对key排序保证顺序稳定 inbound_mgmt_with_index = { for idx, key in sort(keys(local.inbound_mgmt)) : key => merge( local.inbound_mgmt[key], { index = idx } ) } } resource "azurerm_network_security_rule" "allow_inbound_mgmt" { for_each = local.inbound_mgmt_with_index name = "Allowmgmt-${each.key}" # 基于初始值1000加上索引实现递增 priority = 1000 + each.value.index direction = "Inbound" access = "Allow" # 补充资源所需的其他必填参数(比如resource_group_name、network_security_group_name等) }
关键说明:
sort(keys(local.inbound_mgmt)):确保映射的key按固定顺序排列,避免Terraform因key顺序变化触发不必要的资源重建。merge:将原元素的属性与新增的index字段合并,无需修改原inbound_mgmt的结构。
方式二:直接通过index函数计算索引
如果不想生成新的局部映射,也可以直接在priority字段中用index函数结合排序后的key列表计算索引:
locals { inbound_mgmt = { ## List of Locations/sites needing to access the management interface "HQ" = {ip = "1.2.3.4/24"}, "SITE1" = {ip = "3.4.5.6/29"}, "SITE2" = {ip = "6.7.8.9/29"} } } resource "azurerm_network_security_rule" "allow_inbound_mgmt" { for_each = local.inbound_mgmt name = "Allowmgmt-${each.key}" # 排序后获取当前key的索引,再加上初始值1000 priority = 1000 + index(sort(keys(local.inbound_mgmt)), each.key) direction = "Inbound" access = "Allow" # 补充资源所需的其他必填参数 }
注意事项:
- 两种方式都必须对key列表进行排序,否则当原映射的key顺序发生变化时,优先级会乱序,甚至导致Terraform重建安全规则。
- 索引从0开始,所以第一个元素的优先级是1000,第二个是1001,以此类推。如果需要从1001开始,只需把初始值改为1001即可。
内容的提问来源于stack exchange,提问作者Dennis Nielsen
相关产品推荐
相关产品推荐

