Terraform:尝试使用列表创建一系列子网 cidr,但出现错误 "string required"
Terraform: Trying to create a range of subnet cidrs using a list, but getting error "string required"
创建了如下范围列表
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 不支持这个吗?
看来您实际上是想创建几个子网。为此,您应该使用一个 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",
...
}
根据 Terraform Docs,ip_cidr_range
只需要一个 CIDR-Block,而不是列表。因此,您需要像这样为每个子网创建一个资源:
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 而不是计数(查看 Ben 的回答)。如果您稍后更改配置,例如插入一个新的子网,这会表现得更好,如 in this post.
所述
创建了如下范围列表
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 不支持这个吗?
看来您实际上是想创建几个子网。为此,您应该使用一个 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",
...
}
根据 Terraform Docs,ip_cidr_range
只需要一个 CIDR-Block,而不是列表。因此,您需要像这样为每个子网创建一个资源:
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 而不是计数(查看 Ben 的回答)。如果您稍后更改配置,例如插入一个新的子网,这会表现得更好,如 in this post.
所述