我正在使用 terraform 脚本在 Azure 中创建 NIC。默认情况下,它会为 NIC 分配动态私有 IP。如果我选择,private_ip_address_allocation = "Static"
那么我必须传递静态 IP,而且管理所有 IP 信息非常困难。
我曾尝试使用如下方法 -Terraform-在 Azure 上配置静态 IP 地址
resource "azurerm_network_interface" "myterraformnic1" {
count = "${var.my_count}"
name = "myNIC1"
location = "eastus"
resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
network_security_group_id = "${azurerm_network_security_group.myterraformnsg.id}"
ip_configuration {
name = "myNicConfiguration1"
subnet_id = "${azurerm_subnet.myterraformsubnet.id}"
private_ip_address_allocation = "static"
private_ip_address = "${cidrhost("10.0.1.0/24", 4+count.index)}"
}
tags = {
environment = "Terraform Demo1"
}
}
它适用于 1 个 NIC,但我已经为 20 个 NIC 分配了静态 IP,因此无法获取 IP 并设置可用的静态 IP。
我如何自动将私有 IP 设置为静止的在 Terraform 代码本身中?
答案1
不幸的是,这个问题没有简单的解决办法。如果你想要一个具有静态内部 IP 的 NIC,那么 Azure 希望你告诉它你想使用哪个 IP,它不会帮你挑刺。如果你看看这样做的例子使用 ARM 模板,他们作弊并首先将 IP 设置为动态,因此 Azure 生成一个 IP,然后将模式更改为静态。
因此在 Terraform 中,您需要做类似的事情,首先创建具有动态 IP 的 NIC,然后第二次创建相同的 NIC,但这次将其设为静态。
另一种方法是使用cidr子网在 Terraform 中使用 符号来生成子网中的有效 IP 地址。这样可以,但问题是,除非您使用 Terraform 创建了所有子网中的资源并确保每次都增加 IP,否则您无法保证此 IP 未被子网中的其他资源使用。
答案2
因此,这似乎是对 Azure 中私有 IP 的“动态”含义的误解。在 Azure 中创建具有“动态”私有 IP 的 NIC 意味着在创建接口时分配 IP,并且仅在删除接口时释放 IP。
这意味着它的行为与“静态”接口完全一样。
唯一的区别是“静态”接口有一个用户分配的(如输入参数中)IP,而“动态”接口则自动从子网中分配一个免费 IP。我已发送 PR 来更新 tf 文档https://github.com/hashicorp/terraform-provider-azurerm/pull/15264
https://github.com/Azure/azure-quickstart-templates/issues/12159
为了让大家百分百清楚,这确实意味着“动态”IP 永远不会改变,除非您删除 ipconfig 资源。它不会在虚拟机重新分配时改变,也不会在虚拟机崩溃并在另一台主机上启动时改变。