Terraform on Azure - 部署多个子网

Terraform on Azure - Deploy multiple subnet

我正在尝试实施 Terraform 脚本来创建多个子网。

resource "azurerm_subnet" "test_subnet" {
    name = "testSUBNET"
    resource_group_name = "${local.resource_group_name}"
    virtual_network_name = "${azurerm_virtual_network.lab_vnet.name}"
    address_prefix = "10.0.1.0/24"
}

有没有办法对变量执行 for-each 或循环以便同时创建它们?

您可以使用变量和计数索引实现此目的,如下所示:

variable "subnet_prefix" {
  type = "list"
  default = [
    {
      ip      = "10.0.1.0/24"
      name     = "subnet-1"
    },
    {
      ip      = "10.0.2.0/24"
      name     = "subnet-2"
    }
   ]
}

resource "azurerm_subnet" "test_subnet" {
    name = "${lookup(element(var.subnet_prefix, count.index), "name")}"
    count = "${length(var.subnet_prefix)}"
    resource_group_name = "${local.resource_group_name}"
    virtual_network_name = "${azurerm_virtual_network.lab_vnet.name}"
    address_prefix = "${lookup(element(var.subnet_prefix, count.index), "ip")}"
}

新版本for-each也有预览功能

如果您使用的是 Terraform 12,可以使用 for-each capability or the count capability

如果您希望创建几乎相同的资源,则应使用

count

for-each 应该用于根据不同的地图或一​​组值创建每个实例的多个。

使用字符串列表和 toset() 函数进行转换是实现此目的的一种巧妙方法

variable "subnet_ids" {
  type = list(string)
}

resource "aws_instance" "server" {
  for_each = toset(var.subnet_ids)

  ami           = "ami-a1b2c3d4"
  instance_type = "t2.micro"
  subnet_id     = each.key # note: each.key and each.value are the same for a set

  tags = {
    Name = "Server ${each.key}"
  }
}

或者您可以使用类似下面的方法实现此目的:

resource "azurerm_resource_group" "rg" {
  for_each = {
    a_group = "eastus"
    another_group = "westus2"
  }
  name     = each.key
  location = each.value
}

如果您希望使用 Terraform 11 实现此目的,countvariable 功能是除了代码复制之外的唯一方法。 (Rajat Arora 提到过)

我强烈建议使用 Terraform 12,因为 Terraform 11 的提供程序在不久的将来将不再受支持,如果您现在可以避免重构,您应该!