Terraform - 在 Azure 上配置静态 IP 地址

问题描述 投票:0回答:4

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

目前我需要在 Azure 中使用静态 IP 地址配置虚拟机。 试图说服他们摆脱静电,但我对我使用了安全锤,我无法偏转。

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

在我看来,主要问题是并发。 我需要一种方法来自动“分配”子网中的 IP,并确保即使需要一段时间才能构建虚拟机并开始使用该地址,同时运行的其他配置请求也不会获得相同的地址。

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

terraform terraform-provider-azure
4个回答
3
投票

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


1
投票

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

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

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


0
投票

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

我使用

cidrsubnet
从虚拟 LAN 地址空间计算子网,并使用
cidrhost
将私有 IP 分配给主机。 有一个非常好的教程这里

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


-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}"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.