仅将 public IP 添加到一个 NIC (Azure)
Add public IP to only one NIC (Azure)
我正在通过 for_each 创建多个 VM,但只有一个必须具有 public IP 地址。
我怎样才能做到这一点?
可以理解如何使用count来完成,但是for_each的方法是什么?
main.tf
variable "vms" {}
resource "azurerm_network_interface" "nics" {
for_each = var.vms
name = each.value.nic
location = var.resource_location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "nic-${each.value.name}"
subnet_id = lookup(azurerm_subnet.subnets, each.value["subnet_id"], null)["id"]
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.ext_ip.id (BUT ONLY FOR THE FIRST VM IN LIST)
}
}
terraform.tfvars
vms = {
vm1 = {
disk_size = "30"
name = "vm1"
nic = "nic-1"
sku = "7_9"
subnet_id = "snet1"
username = "centos"
vm_size = "Standard_B1ms"
}
vm2 = {
disk_size = "35"
name = "vm2"
nic = "nic-2"
sku = "7_9"
subnet_id = "snet2"
username = "centos"
vm_size = "Standard_B1ls"
}
}
使用以下方法,您可以准备条件 public ip 的映射,然后基于该映射创建资源。
variables.tf
variable "vms" {
type = map(object({
#...
public_ip = optional(bool)
}))
}
locals.tf
pips = { for k, vm in var.vms : k => {
# add required attributes to generate public ip resource
} if vm.public_ip == true
}
main.tf
resource "azurerm_public_ip" "public_ip" {
for_each = local.pips
# ...
}
resource "azurerm_network_interface" "nics" {
for_each = var.vms
# ...
ip_configuration {
#...
public_ip_address_id = try(azurerm_public_ip.public_ip[each.key].id,null)
}
}
我正在通过 for_each 创建多个 VM,但只有一个必须具有 public IP 地址。 我怎样才能做到这一点? 可以理解如何使用count来完成,但是for_each的方法是什么?
main.tf
variable "vms" {}
resource "azurerm_network_interface" "nics" {
for_each = var.vms
name = each.value.nic
location = var.resource_location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "nic-${each.value.name}"
subnet_id = lookup(azurerm_subnet.subnets, each.value["subnet_id"], null)["id"]
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.ext_ip.id (BUT ONLY FOR THE FIRST VM IN LIST)
}
}
terraform.tfvars
vms = {
vm1 = {
disk_size = "30"
name = "vm1"
nic = "nic-1"
sku = "7_9"
subnet_id = "snet1"
username = "centos"
vm_size = "Standard_B1ms"
}
vm2 = {
disk_size = "35"
name = "vm2"
nic = "nic-2"
sku = "7_9"
subnet_id = "snet2"
username = "centos"
vm_size = "Standard_B1ls"
}
}
使用以下方法,您可以准备条件 public ip 的映射,然后基于该映射创建资源。
variables.tf
variable "vms" {
type = map(object({
#...
public_ip = optional(bool)
}))
}
locals.tf
pips = { for k, vm in var.vms : k => {
# add required attributes to generate public ip resource
} if vm.public_ip == true
}
main.tf
resource "azurerm_public_ip" "public_ip" {
for_each = local.pips
# ...
}
resource "azurerm_network_interface" "nics" {
for_each = var.vms
# ...
ip_configuration {
#...
public_ip_address_id = try(azurerm_public_ip.public_ip[each.key].id,null)
}
}