Terraform:尝试使用列表创建一系列子网头,但出现错误“需要字符串”

时间:2020-06-05 13:37:26

标签: google-cloud-platform terraform terraform-provider-gcp

按如下所示创建范围列表

subnet_names = ["subnet-lister", "subnet-kryten", "subnet-rimmer", "subnet-cat", "subnet-holly",]
subnet_cidrs = ["192.2.128.0/18", "192.2.0.0/17", "192.2.208.0/20", "192.2.192.0/20", "192.2.224.0/20",]

与此相关的是subnets.tf

resource "google_compute_subnetwork" "subnet" {
  name          = "${var.subnet_names}-subnet"
  ip_cidr_range = var.subnet_cidrs
  network       = var.network_name
  region        = var.subnet_region

下面是variables.tf(用于模块)

variable "subnet_names" {
  description = "The name to use for Subnet "
  type        =  list(string)
}

variable "subnet_cidrs" {
  description = "The cidr range for for Subnets"
  type        = list(string)
}

但是从Terraform获得以下消息。

Error: Incorrect attribute value type

  on ..\..\..\Test-Modules\red\dwarf\subnets.tf line 3, in resource "google_compute_subnetwork" "subnet":
   3:   ip_cidr_range = var.subnet_cidrs

Inappropriate value for attribute "ip_cidr_range": string required.

我对此很陌生,能帮我弄清楚我要怎么做。我似乎其他人使用了cidr范围的列表(请注意,那是针对AWS的)。 GCP不支持吗?

2 个答案:

答案 0 :(得分:5)

您似乎要尝试实际上创建了几个子网。为此,您应该使用一个map变量和一个循环。

variable "subnets" {
    type = map(string)
}

resource "google_compute_subnetwork" "subnet" {
  for_each      = var.subnets
  name          = each.key
  ip_cidr_range = each.value
  ...
}

然后您可以提供以下子网:

subnets = {
    subnet-lister = "192.2.128.0/18",
    subnet-kryten = "192.2.0.0/17",
    ...
}

答案 1 :(得分:3)

根据Terraform Docsip_cidr_range仅占用一个CIDR块,而不是一个列表。因此,您需要像这样在每个子网中创建一个资源:

resource "google_compute_subnetwork" "subnet" {
  count = length(var.subnet_names)

  name          = "${var.subnet_names[count.index]}-subnet"
  ip_cidr_range = var.subnet_cidrs[count.index]
  network       = var.network_name
  region        = var.subnet_region

  ...

我也建议您稍微重组一下数据,以便可以使用for_each而不是count(请参阅Ben的答案)。这样做的效果更好,以防您稍后更改配置,例如插入一个新的子网,如in this post所述。