Terraform (azurerm):在同一资源组中使用创建多个静态 IP?

Terraform (azurerm): Create multiple static IPs using in the same resource group?

使用 terraform 0.14 和 azurerm 提供程序 2.52.0。

我需要在同一资源组中创建 10+ public/static 个 IP。

我创建了一个可以创建一个 IP 的模块并测试了它是否有效:

modules/public-ip/main.tf

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "ip-rg" {
  name = var.resource_group
  location = var.location
}

resource azurerm_public_ip "public_ip" {
  name                = var.public_ip_name

  resource_group_name = azurerm_resource_group.ip-rg.name
  location = azurerm_resource_group.ip-rg.location
  allocation_method   = "Static"
  ip_version          = "IPv4"
  sku                 = "standard"
}

configurations/dev/main.tf

terraform {
  backend "azurerm" {
    key = "dev.tfstate"
  }
}

module "public_ip_01" {
  source = "../modules/public-ip/"
  resource_group = "public_ip_rg"
  location = "westeurope"  
  public_ip_name="my_public_001"
}

module "public_ip_02" {
  source = "../modules/public-ip/"
  resource_group = "public_ip_rg"
  location = "westeurope"  
  public_ip_name="my_public_002"
}

.....

但这很快就会变得混乱 - 即使我使用相同的模块,也会有 10 多个这样的块。

我想我缺少在 terraform 中执行此操作的更好方法?

您可以在模块中使用for_each and count meta_arguments。特别是在Terraform 0.13中添加了对for_eachcount的模块支持,之前的版本只能与资源一起使用。

例如,您可以使用一个 for_each 参数,其值为该模块块中的映射或一组字符串,Terraform 将为该映射或集合的每个成员创建一个实例。

要像这样创建两个 public IP 地址:

provider "azurerm" {
  features {}
}

module "public_ip_01" {
  for_each = toset(["my_public_001","my_public_002"])
  source = "../modules/public-ip/"
  resource_group = "public_ip_rg"
  location = "westeurope"  
  public_ip_name= each.key
}