使用模块在 Azure Terraform 中创建多个子网

Creating multiple subnets in Azure Terraform using modules

我正在尝试部署两个具有不同 ip 前缀和不同名称的子网,而不创建太多重复代码。我不确定如何最好地处理它。我尝试了以下但它不起作用。我的 terraform 版本是 0.14.11 所以我认为我在下面做的一些事情可能已经过时了

我的 main.tf 在根模块中

module "deploy_subnet" {
source              = "./modules/azure_subnet"
subscription_id     = var.subscription_id
resource_group_name = var.resource_group_name
region              = var.region
vnet_name           = var.vnet_name
count_subnets       = "${length(var.subnet_prefix)}"
subnet_name         = "${lookup(element(var.subnet_prefix, count.index), "name")}"
address_prefix      = "${lookup(element(var.subnet_prefix, count.index), "ip")}"
}

根模块中我的variables.tf(只粘贴相关部分)

variable "subnet_prefix" {
type = "list"
default = [
  {
    ip      = "10.0.1.0/24"
    name     = "aks-sn"
  },
  {
    ip      = "10.0.2.0/24"
    name     = "postgres-sn"
  }
]

}

我的 main.tf 在我的子模块文件夹中

resource "azurerm_subnet" "obc_subnet" {
name = var.subnet_name
count = var.count_subnet
resource_group_name   = var.resource_group_name
virtual_network_name  = var.vnet_name
address_prefixes      = var.address_prefix

}

我的 variables.tf 在我的子模块文件夹中(仅相关部分)

variable "subnet_name" {
  description = "Subnet Name"
}
variable "count_subnet" {
  description = "count"
}
variable "address_prefix" {
  description = "IP Address prefix"
}

我收到以下错误

Reference to "count" in non-counted context
on main.tf line 8, in module "deploy_subnet":
 8:   subnet_name         = "${lookup(element(var.subnet_prefix, count.index),"name")}"
 The "count" object can only be used in "module", "resource", and "data"
 blocks, and only when the "count" argument is set

Reference to "count" in non-counted context
on main.tf line 9, in module "deploy_subnet":
9:   address_prefix      = "${lookup(element(var.subnet_prefix, count.index), "ip")}"
The "count" object can only be used in "module", "resource", and "data"
blocks, and only when the "count" argument is set.

这正是它所说的。在根模块中,您尝试引用 count.index 但没有任何内容被计算在内。您所做的就是将变量传递给子模块。

你只需要将 subnet prefix 传给子模块,在子模块中将计数设置为它的长度,并参考 count.index 获取 address_prefix 的值和name

或者,您可能会研究 for_each 和 each.value

,而且可能更优雅