Terraform - предоставление статических IP-адресов в Azure
Я давно пользуюсь Terraform, и я доволен его использованием с поставщиками VMware и Azure.
В настоящее время у меня есть требование предоставить виртуальным машинам в Azure статические IP-адреса. Пытался отговорить их от статического электричества, но на меня использовали молоток безопасности, который я не могу отклонить.
Хотя я могу выделить некоторые данные в подсети и передать их в Terraform (я использую ansible для управления Terraform), мне было интересно, если бы кто-то еще занимался этой проблемой в Azure и мог бы предложить хорошие идеи.
На мой взгляд, главная проблема - это параллелизм. Мне нужен способ атомарного "выделения" IP-адреса в подсети и уверенность в том, что, даже если для создания виртуальной машины и начала использования этого адреса требуется некоторое время, ни один другой запрос обеспечения, работающий одновременно, не получит такой же.
В частном центре обработки данных я бы использовал решение IPAM. В Azure у меня нет ни одного доступного. Ищете идеи для реализации строго с Azure+Terraform+Ansible
4 ответа
Одним из способов достижения этого является использование интерполяции cidrhost в Terraform.
Вы можете использовать его для создания одного и того же частного 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
Так что это похоже на неправильное представление о том, что означает «динамический» для частного IP-адреса в Azure. Создание сетевой карты в Azure с "динамическим" частным IP-адресом означает, что IP-адрес назначается при создании интерфейса и освобождается только при удалении интерфейса.
Это означает, что он ведет себя точно так же, как «статические» интерфейсы.
Разница лишь в том, что «статическому» интерфейсу назначается пользователем (как во входном параметре) IP, «динамическому» интерфейсу автоматически назначается свободный IP из подсети. Я отправил PR для обновления документов tf https://github.com/hashicorp/terraform-provider-azurerm/pull/15264 .
Я не вижу проблем. У меня есть пример кода для нарезки подсетей, который я использую в реальной работе.
Я использую cidrsubnet
вычислить подсети из виртуального локального адресного пространства и 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 = "testnic"
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}"
}
}