如何使用分配了静态 IP 地址的 Terraform 在循环中创建多个虚拟机网卡
How to create multiple vm nics in a loop using terraform with static ipaddress assigned
我正在尝试使用 Terraform 在 Azure 中创建 2 个 VM,每个 VM 需要 4 个网卡,vnet 的每个子网中各一个,并且这些网卡必须配置静态 IP 地址。有什么方法可以通过 for_each?
理想地使用循环来完成此操作
我可以通过 'dynamic' 为 ip_configuration 块分配 IP 地址来做到这一点,没有问题,但需要它与 'static' IP 分配一起使用,并且不知道如何通过网络接口资源块 ip_configuration 块内的 IP 地址。
我不知道动态块是否适合这里的模型,但我尝试将嵌套循环与动态 ip_configuration 块一起使用,但运气不佳:-(
这是我目前所拥有的(子网 1 的网卡片段),希望得到一些帮助;
variable "subnet1IpAddresses" {
type = map(string)
description = "The subnet1 IP address to assign to vm nodes."
default = {
"1" = "10.10.1.4"
"2" = "10.10.1.5"
}
}
locals {
vmName = [format("%s%s%s%s%s", var.envPrefix, "-", var.dptPrefix, var.vmPrefix, "01"), format("%s%s%s%s%s", var.envPrefix, "-", var.dptPrefix, var.vmPrefix, "02")]
subnet1Ip = [var.subnet1IpAddresses[1], var.subnet1IpAddresses[2]]
}
#create NIC for each NVA and Assign Static IP addresses.
resource "azurerm_network_interface" "subnet1Nics" {
for_each = toset(local.vmName)
name = "${each.value}subnet1-nic"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
enable_ip_forwarding = "true"
enable_accelerated_networking = "true"
dynamic ip_configuration {
for_each = local.subnet1Ip
content {
name = "ipconfig1"
subnet_id = azurerm_subnet.snet1.id
private_ip_address = ip_configuration.value
private_ip_address_allocation = "static"
primary = "true"
}
}
}
上述代码 'as-is' 的问题在于它尝试为同一个虚拟机创建两个 ip_configuration,因此虚拟机 1 将具有具有两个 IP 配置的 nic1,即(10.10.1.4 和 10.10。 1.5) 但这不是我需要的。
简而言之,下面是我对这个具体示例的期望结果,希望有人能提供帮助。
VM1's nic1 with IP (10.10.1.4)
VM2's nic1 with IP (10.10.1.5)
谢谢。
这里举个例子供你参考:2个VM,每个VM有4个NIC,VNet中有4个子网,VM的每个NIC在一个子网中。
main.tf:
provider "azurerm" {
features {}
}
variable "nics" {}
variable "vnet_prefix" {}
variable "subnet_prefixes" {}
resource "azurerm_resource_group" "group" {
name = "charlesVM"
location = "East Asia"
}
resource "azurerm_virtual_network" "vnet" {
name = "charles-vnet"
resource_group_name = azurerm_resource_group.group.name
location = azurerm_resource_group.group.location
address_space = var.vnet_prefix
}
resource "azurerm_subnet" "subnets" {
count = length(var.subnet_prefixes)
name = "subnet-${count.index}"
resource_group_name = azurerm_resource_group.group.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefix = element(var.subnet_prefixes, count.index)
}
resource "azurerm_network_interface" "nics" {
count = length(var.nics)
name = "nic-${count.index}"
location = azurerm_resource_group.group.location
resource_group_name = azurerm_resource_group.group.name
ip_configuration {
name = "config-${count.index}"
subnet_id = element(azurerm_subnet.subnets[*].id, count.index % 4)
private_ip_address_allocation = "Static"
private_ip_address = element(var.nics, count.index)
}
}
locals {
vm_nics = chunklist(azurerm_network_interface.nics[*].id, 4)
}
resource "azurerm_linux_virtual_machine" "vm" {
count = 2
name = "azurevm-${count.index}"
resource_group_name = azurerm_resource_group.group.name
location = azurerm_resource_group.group.location
size = "Standard_DS3_v2"
admin_username = "adminuser"
network_interface_ids = element(local.vm_nics, count.index)
admin_ssh_key {
username = "adminuser"
public_key = file("~/.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04-LTS"
version = "latest"
}
}
terraform.tfvar:
nics = [
"10.0.0.4",
"10.0.1.4",
"10.0.2.4",
"10.0.3.4",
"10.0.0.5",
"10.0.1.5",
"10.0.2.5",
"10.0.3.5"
]
vnet_prefix = ["10.0.0.0/16"]
subnet_prefixes = [
"10.0.0.0/24",
"10.0.1.0/24",
"10.0.2.0/24",
"10.0.3.0/24"
]
注意,如果要使用静态IP地址,则需要手动计算避免冲突,并确保网卡的每个IP地址都在子网内。并且您还需要选择合适的 VM 大小,一个 VM 可以支持 4 个 NIC。
我正在尝试使用 Terraform 在 Azure 中创建 2 个 VM,每个 VM 需要 4 个网卡,vnet 的每个子网中各一个,并且这些网卡必须配置静态 IP 地址。有什么方法可以通过 for_each?
理想地使用循环来完成此操作我可以通过 'dynamic' 为 ip_configuration 块分配 IP 地址来做到这一点,没有问题,但需要它与 'static' IP 分配一起使用,并且不知道如何通过网络接口资源块 ip_configuration 块内的 IP 地址。
我不知道动态块是否适合这里的模型,但我尝试将嵌套循环与动态 ip_configuration 块一起使用,但运气不佳:-(
这是我目前所拥有的(子网 1 的网卡片段),希望得到一些帮助;
variable "subnet1IpAddresses" {
type = map(string)
description = "The subnet1 IP address to assign to vm nodes."
default = {
"1" = "10.10.1.4"
"2" = "10.10.1.5"
}
}
locals {
vmName = [format("%s%s%s%s%s", var.envPrefix, "-", var.dptPrefix, var.vmPrefix, "01"), format("%s%s%s%s%s", var.envPrefix, "-", var.dptPrefix, var.vmPrefix, "02")]
subnet1Ip = [var.subnet1IpAddresses[1], var.subnet1IpAddresses[2]]
}
#create NIC for each NVA and Assign Static IP addresses.
resource "azurerm_network_interface" "subnet1Nics" {
for_each = toset(local.vmName)
name = "${each.value}subnet1-nic"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
enable_ip_forwarding = "true"
enable_accelerated_networking = "true"
dynamic ip_configuration {
for_each = local.subnet1Ip
content {
name = "ipconfig1"
subnet_id = azurerm_subnet.snet1.id
private_ip_address = ip_configuration.value
private_ip_address_allocation = "static"
primary = "true"
}
}
}
上述代码 'as-is' 的问题在于它尝试为同一个虚拟机创建两个 ip_configuration,因此虚拟机 1 将具有具有两个 IP 配置的 nic1,即(10.10.1.4 和 10.10。 1.5) 但这不是我需要的。
简而言之,下面是我对这个具体示例的期望结果,希望有人能提供帮助。
VM1's nic1 with IP (10.10.1.4)
VM2's nic1 with IP (10.10.1.5)
谢谢。
这里举个例子供你参考:2个VM,每个VM有4个NIC,VNet中有4个子网,VM的每个NIC在一个子网中。
main.tf:
provider "azurerm" {
features {}
}
variable "nics" {}
variable "vnet_prefix" {}
variable "subnet_prefixes" {}
resource "azurerm_resource_group" "group" {
name = "charlesVM"
location = "East Asia"
}
resource "azurerm_virtual_network" "vnet" {
name = "charles-vnet"
resource_group_name = azurerm_resource_group.group.name
location = azurerm_resource_group.group.location
address_space = var.vnet_prefix
}
resource "azurerm_subnet" "subnets" {
count = length(var.subnet_prefixes)
name = "subnet-${count.index}"
resource_group_name = azurerm_resource_group.group.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefix = element(var.subnet_prefixes, count.index)
}
resource "azurerm_network_interface" "nics" {
count = length(var.nics)
name = "nic-${count.index}"
location = azurerm_resource_group.group.location
resource_group_name = azurerm_resource_group.group.name
ip_configuration {
name = "config-${count.index}"
subnet_id = element(azurerm_subnet.subnets[*].id, count.index % 4)
private_ip_address_allocation = "Static"
private_ip_address = element(var.nics, count.index)
}
}
locals {
vm_nics = chunklist(azurerm_network_interface.nics[*].id, 4)
}
resource "azurerm_linux_virtual_machine" "vm" {
count = 2
name = "azurevm-${count.index}"
resource_group_name = azurerm_resource_group.group.name
location = azurerm_resource_group.group.location
size = "Standard_DS3_v2"
admin_username = "adminuser"
network_interface_ids = element(local.vm_nics, count.index)
admin_ssh_key {
username = "adminuser"
public_key = file("~/.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04-LTS"
version = "latest"
}
}
terraform.tfvar:
nics = [
"10.0.0.4",
"10.0.1.4",
"10.0.2.4",
"10.0.3.4",
"10.0.0.5",
"10.0.1.5",
"10.0.2.5",
"10.0.3.5"
]
vnet_prefix = ["10.0.0.0/16"]
subnet_prefixes = [
"10.0.0.0/24",
"10.0.1.0/24",
"10.0.2.0/24",
"10.0.3.0/24"
]
注意,如果要使用静态IP地址,则需要手动计算避免冲突,并确保网卡的每个IP地址都在子网内。并且您还需要选择合适的 VM 大小,一个 VM 可以支持 4 个 NIC。