我已经使用 Terraform 一段时间了,并且对它与 VMware 和 Azure 提供商的使用感到满意。
目前我需要在 Azure 中使用静态 IP 地址配置虚拟机。 试图说服他们摆脱静电,但我对我使用了安全锤,我无法偏转。
虽然我可以在子网中分配一些并将它们提供给 Terraform(我使用 ansible 来驱动 Terraform),但我想知道是否有其他人在 Azure 中解决了这个问题并且可能有好的想法。
在我看来,主要问题是并发。 我需要一种方法来自动“分配”子网中的 IP,并确保即使需要一段时间才能构建虚拟机并开始使用该地址,同时运行的其他配置请求也不会获得相同的地址。
在私有数据中心中,我会使用 IPAM 解决方案。 在 Azure 中我没有可用的。 寻找严格使用 Azure+Terraform+Ansible 实施的想法
实现此目的的一种方法是使用 Terraform 中的 cidrhost 插值。
您可以使用它每次创建相同的私有IP地址。一个例子如下:
resource "azurerm_network_interface" "network_interface" {
name = "dev-network-interface"
location = "WestEurope"
resource_group_name = "dev-rg"
ip_configuration {
name = "dev-nic-ipconfig"
subnet_id = "${subnet_id}"
private_ip_address_allocation = "static"
private_ip_address = "${cidrhost(10.100.0.56/27, 4)}"
public_ip_address_id = "${publicip_id}"
}
上面的例子应该给你一个私有IP 10.100.0.60
因此,这似乎是对 Azure 中私有 IP 的“动态”含义的误解。在 Azure 中使用“动态”专用 IP 创建 NIC 意味着该 IP 在创建接口时分配,并且仅在删除接口时释放。
这意味着它的行为与“静态”接口完全相同。
唯一的区别是“静态”接口具有用户分配的(如在输入参数中)IP,“动态”接口会自动从子网分配一个免费IP。我已发送 PR 来更新 tf 文档 https://github.com/hashicorp/terraform-provider-azurerm/pull/15264
我看没问题。我有一些用于在实际工作中使用的子网切片的示例代码。
cidrsubnet
从虚拟 LAN 地址空间计算子网,并使用 cidrhost
将私有 IP 分配给主机。
有一个非常好的教程这里。
显然分配静态 IP 在自动缩放等场景中不起作用。
我也使用terraform内置函数来雕刻ip地址,但我也理解你的问题,但我不明白答案,这并不能保证ip不会被使用。 似乎您还需要一个变量作为 ip 地址,以从部署系统推送以迭代而不重叠 ip 地址。
我很想知道上述答案的完整解决方案。
无论如何,我有一个创建环境的模块,我使用下面的示例来获取静态 IP 地址,如果您重新运行该模块,它会将静态 IP 地址反转为动态,然后返回静态:)
我自己的答案是首先创建一个设置为静态的网卡,然后使用动态 IP 地址再次创建相同的网卡,示例如下:
resource "azurerm_network_interface" "vm_nic" {
name = "nic"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.rg.name}"
ip_configuration {
name = "privatenic"
subnet_id = "${data.azurerm_subnet.subnet.id}"
private_ip_address_allocation = "dynamic"
}
}
resource "azurerm_network_interface" "vm_staticnic" {
name = "nic"
location = "${var.location}"
resource_group_name = "${azurerm_resource_group.rg.name}"
ip_configuration {
name = "privatenic"
subnet_id = "${data.azurerm_subnet.subnet.id}"
private_ip_address_allocation = "static"
private_ip_address = "${azurerm_network_interface.vm_nic.private_ip_address}"
}
}