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 实现此目的,count
和 variable
功能是除了代码复制之外的唯一方法。 (Rajat Arora 提到过)
我强烈建议使用 Terraform 12,因为 Terraform 11 的提供程序在不久的将来将不再受支持,如果您现在可以避免重构,您应该!
我正在尝试实施 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 实现此目的,count
和 variable
功能是除了代码复制之外的唯一方法。 (Rajat Arora 提到过)
我强烈建议使用 Terraform 12,因为 Terraform 11 的提供程序在不久的将来将不再受支持,如果您现在可以避免重构,您应该!