2

我使用 Terraform 已经有一段时间了,并且对它与 VMware 和 Azure 提供商的使用感到满意。

目前,我需要在 Azure 中使用静态 IP 地址预配 VM。试图让他们摆脱静电,但我用了一个安全锤,我无法偏转。

虽然我可以在子网中分配一些并将它们提供给 Terraform(我使用 ansible 来驱动 Terraform),但我想知道是否有人在 Azure 中解决了这个问题并且可能有好的想法。

正如我所看到的,主要问题是并发性。我需要一种在子网中原子地“分配”IP 的方法,并确保即使需要一段时间才能构建 VM 并开始使用该地址,同时运行的其他供应请求也不会得到相同的请求。

在私有数据中心,我会使用 IPAM 解决方案。在 Azure 中,我没有可用的。寻找使用 Azure+Terraform+Ansible 严格实施的想法

4

4 回答 4

2

实现此目的的一种方法是在 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

于 2018-06-07T10:49:02.030 回答
0

我看没问题。我有一些在实际工作中使用的切片子网的示例代码

我使用cidrsubnet来计算来自虚拟局域网地址空间的子网cidrhost并将私有 IP 分配给主机。这里有一个很好的教程。

显然,分配静态 IP 在自动缩放等场景中不起作用。

于 2018-05-12T09:21:38.690 回答
0

因此,这似乎是对 Azure 中私有 IP 的“动态”含义的误解。在 Azure 中使用“动态”私有 IP 创建 NIC 意味着 IP 在创建接口时分配,并且仅在删除接口时释放。

这意味着它的行为与“静态”接口完全相同。

唯一的区别是“静态”接口有一个用户分配的(如输入参数)IP,“动态”接口自动分配一个来自子网的空闲 IP。我已发送 PR 以更新 tf 文档https://github.com/hashicorp/terraform-provider-azurerm/pull/15264

于 2022-02-05T13:09:09.770 回答
-1

我也使用 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}"
  }
}
于 2018-11-01T17:43:05.547 回答