使用 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 中做到这一点?
答案 0 :(得分:1)
您可以在模块中使用 for_each 和 count 元参数。特别是在 Terraform 0.13 中添加了对 for_each
和 count
的模块支持,以前的版本只能与资源一起使用。
例如,您可以使用 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
}