Terraform удаляет ресурсы Azure при последующем применении без изменения конфигурации.

Я пытался протестировать сценарий обработки внешних изменений существующих ресурсов, а затем синхронизировать мою конфигурацию HCL с текущим состоянием в следующем приложении. Я мог добиться этого, используя taint для измененного ресурса, но TF удалил другие ресурсы, которые были развернуты во время первого применения. Вот код модуля для виртуальной сети с 3 подсетями (prod, dmz и app) и 3 связанными группами безопасности сети. И я тестировал с изменением одной из групп безопасности сети, но TF удалил все подсети -

VNET-

resource "azurerm_virtual_network" "BP-VNet" {

name = var.Vnetname
location = var.location
resource_group_name = var.rgname
address_space = var.vnetaddress
subnet {
    name = "GatewaySubnet"
    address_prefix = "10.0.10.0/27"
}

}

Подсеть -

resource "azurerm_subnet" "subnets" {
count = var.subnetcount
name = "snet-prod-${lookup(var.snettype, count.index, "default")}-001"
address_prefixes = ["10.0.${count.index+1}.0/24"]
resource_group_name = var.rgname
virtual_network_name = azurerm_virtual_network.BP-VNet.name

}

ГЯП-

    resource "azurerm_network_security_group" "nsgs" {
count = var.subnetcount
name = "nsg-prod-${lookup(var.snettype, count.index, "default")}"
resource_group_name = var.rgname
location = var.location
--------
}

BastionSubnet-

    resource "azurerm_subnet" "bastionsubnet" {
  name = "AzureBastionSubnet"
  virtual_network_name = azurerm_virtual_network.BP-VNet.name
  resource_group_name = var.rgname
  address_prefixes = [ "10.0.5.0/27" ]
}

Конечный результат второго применения -

введите описание изображения здесь

Только с подсетью шлюза. Остальные 4 подсети не должны были быть удалены. Почему это происходит?


person Anshul Srivastava    schedule 07.05.2021    source источник
comment
О том, что я тестировал с изменением одной из групп безопасности сети, какой конкретный процесс вы выполняли?   -  person Nancy Xiong    schedule 07.05.2021
comment
Изменен приоритет одного из входящих правил. После второго применения он вернулся к значению, указанному в конфигурации HCL.   -  person Anshul Srivastava    schedule 07.05.2021
comment
Terraform run применяется на основе кода шаблона из последнего файла terraform.tfstate. Вы проверили файл terraform.tfstate перед повторным запуском приложения?   -  person Nancy Xiong    schedule 07.05.2021
comment
да. В файле состояния я мог видеть все ресурсы, как и ожидалось   -  person Anshul Srivastava    schedule 07.05.2021
comment
Было бы хорошо, если бы я пришлю вам заархивированные файлы модулей - файл состояния, переменные и main? @NancyXiong   -  person Anshul Srivastava    schedule 07.05.2021
comment
Думаю, я воспроизвел вашу проблему. Вы изменили приоритет одного из входящих правил в NSG, которое использует count, затем вы искажаете этот nsg, а затем запускаете terraform apply?   -  person Nancy Xiong    schedule 07.05.2021
comment
@NancyXiong - Совершенно верно!   -  person Anshul Srivastava    schedule 07.05.2021
comment
@NancyXiong - У вас была возможность разобраться в этом?   -  person Anshul Srivastava    schedule 10.05.2021
comment
С какой целью вы используете заражение?   -  person Charles Xu    schedule 10.05.2021
comment
@ CharlesXu - я тестировал, чтобы увидеть, как я могу вернуть внешне измененный ресурс в его исходное состояние, как указано в конфигурации HCL, путем повторного развертывания   -  person Anshul Srivastava    schedule 10.05.2021
comment
Можете ли вы поделиться всем кодом Terraform и командами, которые вы используете для заражения измененного ресурса?   -  person Charles Xu    schedule 11.05.2021
comment
@ CharlesXu - вот заархивированный код - demosg1199.blob .core.windows.net / tf-files /. Я использовал команду is terraform taint azurerm_network_security_group.nsgs [2]   -  person Anshul Srivastava    schedule 11.05.2021
comment
Есть новости по этому вопросу? Решает ли это вашу проблему?   -  person Charles Xu    schedule 12.05.2021


Ответы (1)


Решение может вас запутать. Вы можете отделить GatewaySubnet от блока azurerm_virtual_network на блок azurerm_subnet. Код выглядит так:

resource "azurerm_subnet" "gateway" {
  name = "GatewaySubnet"
  resource_group_name = var.rgname
  virtual_network_name = azurerm_virtual_network.BP-VNet.name
  address_prefixes = ["10.0.10.0/27"]
}

Я не знаю точной причины, но это решает вашу проблему.

person Charles Xu    schedule 11.05.2021
comment
Спасибо за обходной путь, я сам тестировал это на прошлых выходных, и это помогло не удалять ресурсы при последующем применении. Но моей главной заботой было понять причину, упомянутую в моем вопросе, если я изменяю ресурсы, созданные из циклов или вместе с родительским ресурсом. - person Anshul Srivastava; 12.05.2021
comment
@AnshulSrivastava Цикл не имеет значения. И вы также можете поместить все подсети в родительский ресурс, ресурс виртуальной сети. Есть предположение, что, когда он применяется во второй раз, он обновит состояние всех ресурсов, и подсеть не является отдельным ресурсом, это вспомогательный ресурс виртуальной сети. Таким образом, он обновляет только виртуальную сеть и игнорирует блок подсетей. Не уверен, но это возможная причина. Я не нашел ни одного документа, объясняющего причину. - person Charles Xu; 12.05.2021
comment
@AnshulSrivastava Есть обновления? Вы решаете проблему? - person Charles Xu; 17.05.2021
comment
Да, пока спасибо! - person Anshul Srivastava; 19.05.2021