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

时间:2021-03-20 17:15:52

标签: azure terraform terraform-provider-azure

使用 terraform 0.14 和 azurerm provider 2.52.0。

我需要在同一个资源组中创建 10 多个公共/静态 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 中做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

像这样创建两个公共 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
}