【问题标题】:Terraform deletes Azure resources in subsequent 'apply' without any config changeTerraform 在后续的“应用”中删除 Azure 资源,而无需更改任何配置
【发布时间】:2021-07-29 11:37:53
【问题描述】:

我试图测试处理对现有资源的外部更改的场景,然后在下一次应用中将我的 HCL 配置同步到当前状态。我可以对修改后的资源使用“污点”来实现这一点,但是 TF 删除了在第一次“应用”期间部署的其他资源。这是具有 3 个子网(prod、dmz 和应用程序)和 3 个关联的 NSG 的 VNet 的模块代码。我通过修改其中一个 NSG 进行了测试,但 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

}

NSG-

    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 个子网。为什么会这样?

【问题讨论】:

  • 关于“我通过修改其中一个 NSG 进行测试”,您的具体流程是什么?
  • 更改了入站规则之一的优先级。第二次应用后,它被恢复为 HCL 配置中提到的值。
  • Terraform 运行应用基于上一个 terraform.tfstate 文件中的模板代码。在重新运行 apply 之前,您是否检查了 terraform.tfstate 文件?
  • 是的。在状态文件中,我可以按预期看到所有资源
  • 我想我已经复制了你的问题。您是否更改了 NSG 中使用 count 的入站规则之一的优先级,然后污染了该 nsg,然后运行 ​​terraform apply?

标签: azure terraform azure-virtual-network terraform-provider-azure infrastructure-as-code


【解决方案1】:

该解决方案可能会让您感到困惑。您可以将GatewaySubnetazurerm_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"]
}

我不知道具体原因,但它解决了你的问题。

【讨论】:

  • 感谢您的解决方法,我上周末自己进行了测试,它确实有助于在后续应用中不删除资源。但我主要关心的是了解我的问题中提到的原因,如果我正在更改从循环创建的资源或与父资源一起创建的资源。
  • @AnshulSrivastava 循环无关紧要。您还可以将所有子网放在父资源 VNet 资源中。有一种猜测,第二次应用时,会刷新所有资源状态,而子网不是单个资源,是VNet的子资源。所以它只刷新 VNet 并忽略子网块。不确定,但这是一个可能的原因。我没有找到任何解释原因的文件。
  • @AnshulSrivastava 有什么更新吗?你解决问题了吗?
猜你喜欢
  • 2021-11-15
  • 2021-03-03
  • 1970-01-01
  • 2020-12-23
  • 2020-01-24
  • 2022-01-21
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多