【问题标题】:creating Subnet in a loop in Terraform在 Terraform 中循环创建子网
【发布时间】:2020-09-06 02:08:10
【问题描述】:

我是 Terraform 的新手。 我正在尝试创建一个代码,我可以在其中循环创建子网,但 cidrsubnet 函数无法正常工作,因为我不想更改子网掩码。 例如:我想用这些 IP 创建子网:子网 1:10.90.46.0/27,子网 2:10.90.46.32/27 子网 3:10.90.46.64/27 等等,直到子网 8:10.90.46.224/27 谢谢

【问题讨论】:

  • 您能否提供您的代码示例以及您收到的错误消息?

标签: amazon-web-services terraform amazon-vpc terraform-provider-aws


【解决方案1】:

应用计数,这将乘以资源的数量。

variable "vpc_id" {
  default = "vpc-123"
}

#Here add all your 8 CIDR's to the list in "subnet_cidr" and for each one add one entry in "subnet_azs". You can repeat values in "subnet_azs" but not in subnet_cidr"

variable "subnet_cidr" {
  default = ["10.90.46.0/27", "10.90.46.32/27", "10.90.46.64/27", "10.90.46.224/27"]
}

variable "subnet_azs" {
  default = ["us-east-1a", "us-east-1b", "us-east-1c", "us-east-1c"]
}

resource "aws_subnet" "my_subnets" {
  count             = 8
  vpc_id            = "${var.vpc_id}"
  cidr_block        = "${element(var.subnet_cidr, count.index)}"
  availability_zone = "${element(var.subnet_azs, count.index)}"
}

【讨论】:

  • 那太棒了,但无论如何我可以给第一个子网 10.90.46.0/27 然后它可以自动创建其余 8 个子网,而无需我提及所有子网 CIDR。我问的另一个要求是创建 16 个子网,我不想手动放置子网。
  • 添加到我的答案中:terraform.io/docs/configuration/functions/cidrsubnets.html :) 如果这解决了您的问题,请标记为答案! @RohitSingh
【解决方案2】:

自动分配 IP 地址范围序列的一种方法是使用 Terraform 注册表中的 the hashicorp/subnets/cidr module

module "subnet_addrs" {
  source  = "hashicorp/subnets/cidr"
  version = "1.0.0"

  base_cidr_block = "10.90.46.0/24"
  networks = [
    { name = "us-east-1a", new_bits = 3 },
    { name = "us-east-1b", new_bits = 3 },
    { name = "us-east-1c", new_bits = 3 },
    { name = "us-east-1d", new_bits = 3 },
    { name = "us-east-1e", new_bits = 3 },
    { name = "us-east-1f", new_bits = 3 },
    { name = "us-east-1g", new_bits = 3 },
    { name = "us-east-1h", new_bits = 3 },
  ]
}

对于上面的例子,module.subnet_addrs.network_cidr_blocks 将是这样的地图:

{
  "us-east-1a" = "10.90.46.0/27"
  "us-east-1b" = "10.90.46.32/27"
  "us-east-1c" = "10.90.46.64/27"
  "us-east-1d" = "10.90.46.96/27"
  "us-east-1e" = "10.90.46.128/27"
  "us-east-1f" = "10.90.46.160/27"
  "us-east-1g" = "10.90.46.192/27"
  "us-east-1h" = "10.90.46.224/27"
}

这样的映射可以直接用作资源的for_each,因此我们可以像这样声明子网,以AWS为例(因为您没有说明您使用的是哪个云供应商):

resource "aws_subnet" "my_subnets" {
  for_each = module.subnet_addrs.network_cidr_blocks

  vpc_id            = var.vpc_id
  availability_zone = each.key
  cidr_block        = each.value
}

本模块的自述文件中有一些关于 [如果您打算rename or renumber networks later 时要记住的事情,以确保您所做的更改与已经存在的对象兼容。我建议您在采用此方法之前查看该文档,以确保您能够将任何未来更改应用到您可能想象的未来网络拓扑结构中。

例如,上面示例中的分配已经覆盖了整个寻址空间"10.90.46.0/24",因此如果您以后想添加一个新子网而不引入任何新的寻址空间,则需要替换其中一个现有子网有一对替换子网,它们都具有new_bits = 4,因此前缀长度为/28,而不是/27,这样您就有一个额外的位可用于网络编号。

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 2018-07-29
    • 2018-06-26
    • 1970-01-01
    • 2021-08-15
    • 2022-11-16
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多