Я использую Terraform несколько недель, и это отличный инструмент.
Однако в последнее время во время развертывания я получал множество ошибок.
У меня есть базовый файл .tf для развертывания Azure, в котором создаются все необходимые компоненты. Но по какой-то причине я продолжаю получать ResourceNotFound. Если я перезапущу скрипт, он будет работать нормально.
Главный виновник - ресурс «azurerm_virtual_network». Кажется, что любые ресурсы, которые являются зависимыми от них, терпят неудачу, потому что виртуальная сеть все еще «Создает ...», когда пытается добавить правила NSG или «azurerm_subnet».
Это не шоу-стоп, это скорее досада! Есть ли способ предотвратить эту ошибку?
На стороне нет: мне также, кажется, нужно развернуть правила NSG после того, как все было применено, иначе правила NSG, похоже, не влияют. В настоящее время у меня есть 2 файла .tf в разных папках, которые я запускаю по порядку, и правила NSG отлично справляются с этим. Хотя, если возможно, я бы предпочел все это в одном файле?
// Virtual Network
resource "azurerm_virtual_network" "Prod_VirtualNetwork" {
name = "virtual-network"
address_space = ["10.1.0.0/16"]
location = "${var.azurerm_location}"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
}
// Subnet configurtion
resource "azurerm_subnet" "Prod_subnet" {
name = "${var.azurerm_prefix}-subnet"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
virtual_network_name = "virtual-network"
address_prefix = "10.1.12.0/24"
}
// Network Security group for Web Servers
resource "azurerm_network_security_group" "Prod_nsg_Webservers" {
name = "${var.azurerm_prefix}-nsg-web-01"
location = "${var.azurerm_location}"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
}
// Network Security group for DB Servers
resource "azurerm_network_security_group" "Prod_nsg_DBservers" {
name = "${var.azurerm_prefix}-nsg-db-01"
location = "${var.azurerm_location}"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
}
// Network Security group rule for RDP inbound to Web01
resource "azurerm_network_security_rule" "Prod_nsgrule_RDP_Web01" {
name = "Web-RDP-IN"
priority = 200
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "3389"
destination_port_range = "3389"
source_address_prefix = ""
destination_address_prefix = "10.1.12.5"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
network_security_group_name = "${var.azurerm_prefix}-nsg-web-01"
}
// Network Security group rule for web/80 inbound to Web01
resource "azurerm_network_security_rule" "Prod_nsgrule_http_Web01" {
name = "Web-HTTP-IN"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "80"
destination_port_range = "80"
source_address_prefix = "*"
destination_address_prefix = "10.1.12.5"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
network_security_group_name = "${var.azurerm_prefix}-nsg-web-01"
}
// Network Security group rule for Octopus Deploy inbound to Web01
resource "azurerm_network_security_rule" "Prod_nsgrule_octopus_Web01" {
name = "Web-Octo-IN"
priority = 110
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "10933"
destination_port_range = "10933"
source_address_prefix = ""
destination_address_prefix = "10.1.12.5"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
network_security_group_name = "${var.azurerm_prefix}-nsg-web-01"
}
// Network Security group rule for Octopus Deploy inbound to DB01
resource "azurerm_network_security_rule" "Prod_nsgrule_octopus_DB01" {
name = "DB-Octo-IN"
priority = 120
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "10933"
destination_port_range = "10933"
source_address_prefix = ""
destination_address_prefix = "10.1.12.4"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
network_security_group_name = "${var.azurerm_prefix}-nsg-db-01"
}
// Network Security group rule for RDP inbound to DB01
resource "azurerm_network_security_rule" "Prod_nsgrule_RDP_DB01" {
name = "DB-RDP-IN"
priority = 220
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "3389"
destination_port_range = "3389"
source_address_prefix = ""
destination_address_prefix = "10.1.12.4"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
network_security_group_name = "${var.azurerm_prefix}-nsg-db-01"
}
Я не вижу явной зависимости между вашей виртуальной сетью и подсетью, вы жестко запрограммировали имя сети, поэтому я не думаю, что Terraform создаст зависимость.
Если вы измените определение подсети на:
resource "azurerm_subnet" "Prod_subnet" {
name = "${var.azurerm_prefix}-subnet"
resource_group_name = "${azurerm_resource_group.Prod_RG.name}"
virtual_network_name = "${azurerm_virtual_network.Prod_VirtualNetwork.name}"
address_prefix = "10.1.12.0/24"
}
Это должно дать Terraform ключ к пониманию того, что один должен быть создан раньше другого.