首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在terraform资源中的How映射和列表上创建嵌套的for-循环

如何在terraform资源中的How映射和列表上创建嵌套的for-循环
EN

Stack Overflow用户
提问于 2021-07-27 07:44:03
回答 1查看 320关注 0票数 2

我有两个via映射,我想通过一个嵌套的for-循环(即内部循环和外部循环)来循环。

例如,在Python中,这将非常容易:

代码语言:javascript
复制
for i in list_1:
  for j in list_2:
    # do sth.
    print(i, j)

1)我的拉链图的定义

zipmap 1:"masked_cidr_blocks_zipmap“

代码语言:javascript
复制
dms_ip_addresses = data.dns_a_record_set.input_dms.addrs
cidr_blocks      = [for idx in range(length(dms_ip_addresses)) : join("", [dms_ip_addresses[idx], "/16"])]
masked_cidr_blocks_zipmap = zipmap(range(length(cidr_blocks)),
[for idx in range(length(cidr_blocks)) : cidrsubnet(cidr_blocks[idx], 0, 0)])

根据zipmap文档,zipmap的结构类似于zipmap(keyslist, valueslist),例如(虚拟值):

代码语言:javascript
复制
> zipmap(["0", "1"], ["199.99.0.0/16", "199.97.0.0/16"])
{
  "0" = "199.99.0.0/16",
  "1" = "199.97.0.0/16",
}

zipmap 2:"network_acls“

代码语言:javascript
复制
network_acls = zipmap(range(length(data.aws_network_acls.main.ids)),
data.aws_network_acls.main.ids)

这种情况下的一个例子可以是(虚拟值):

代码语言:javascript
复制
> zipmap(["0", "1"], ["acl-328ufjf2j3923rjf22", "acl-23489289jf23rf232r"])
    {
      "0" = "acl-328ufjf2j3923rjf22",
      "1" = "acl-23489289jf23rf232r",
    }

2)创建嵌套for-循环的意图

请注意,下面是伪代码,它在terraform中不是那样工作的(不幸的是):

代码语言:javascript
复制
resource "aws_network_acl_rule" "dms_control_port" {
for_each = local.network_acls  # outer for-loop
  for_each = local.masked_cidr_blocks_zipmap  # inner for-loop

  network_acl_id = each_outer.value
  rule_number    = 415 + each_inner.key
  egress         = false
  protocol       = "tcp"
  rule_action    = "allow"
  cidr_block     = each_inner.value
  from_port      = 443
  to_port        = 443
}

如何实现资源"aws_network_acl_rule“"dms_control_port”中的嵌套循环行为,从而使用外部或内部循环值填充不同的参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-27 08:50:57

您正在通过扁平您的数据集来模拟双for_each。因此,对于你的例子:

代码语言:javascript
复制
locals {
  network_acls =     {
      "0" = "acl-328ufjf2j3923rjf22",
      "1" = "acl-23489289jf23rf232r",
    }
    
  masked_cidr_blocks_zipmap =  {
      "0" = "199.99.0.0/16",
      "1" = "199.97.0.0/16",
    }
  
  # flatten data structure
  acls_cidr = merge([
          for ni,acl in local.network_acls:
           {
             for maskedi,cidr in local.masked_cidr_blocks_zipmap: 
             "${ni}-${maskedi}" => {
                   "ni" = ni
                   "maskedi" = maskedi  
                   "acl" = acl
                   "cidr" = cidr                   
               }
           }    
        ]...) 
}

给予:

代码语言:javascript
复制
{
  "0-0" = {
    "acl" = "acl-328ufjf2j3923rjf22"
    "cidr" = "199.99.0.0/16"
    "maskedi" = "0"
    "ni" = "0"
  }
  "0-1" = {
    "acl" = "acl-328ufjf2j3923rjf22"
    "cidr" = "199.97.0.0/16"
    "maskedi" = "1"
    "ni" = "0"
  }
  "1-0" = {
    "acl" = "acl-23489289jf23rf232r"
    "cidr" = "199.99.0.0/16"
    "maskedi" = "0"
    "ni" = "1"
  }
  "1-1" = {
    "acl" = "acl-23489289jf23rf232r"
    "cidr" = "199.97.0.0/16"
    "maskedi" = "1"
    "ni" = "1"
  }
}

然后只需使用 for_each (仅在下面的示例中--我不知道在设置中哪个变量是哪个变量):

代码语言:javascript
复制
resource "aws_network_acl_rule" "dms_control_port" {
  
  for_each = local.acls_cidr

  network_acl_id = each.value.ni
  rule_number    = 415 + each.value.maskedi
  egress         = false
  protocol       = "tcp"
  rule_action    = "allow"
  cidr_block     = each.value.cidr
  from_port      = 443
  to_port        = 443
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68540833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档