Terraform试图替换现有资源



对不起,如果这是一个假问题,但我是新的地形,我可以找到任何文档或任何涵盖这种情况。

我有资源组= rg1,其中vnet = vnet1子网= subnet1.

我正在尝试创建一个新的子网(subnet2)在同一个vnet (vnet1), terraform给出如下错误:

~ name = "→"subnet2"#强制替换

计划:1添加,0更改,1销毁。

谁能告诉我为什么terraform替换已经创建的子网?有没有可能的解决办法?

编辑1

很抱歉没有包括代码,请参见下面的代码;

main.tf

resource "azurerm_resource_group" "rg" {
name     = var.rgname
location = var.rglocation
}
resource "azurerm_virtual_network" "vnet" {
name                = var.vnetname
address_space       = [var.vnet_address_space]
location            = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
resource "azurerm_subnet" "vnet_subnets" {
name                 = var.subnet_name
resource_group_name  = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes     = [var.subnet_prefix]
}

Tfvars

rglocation = "westus"
rgname     = "rg1"
vnetname           = "vnet1"
vnet_address_space = "10.0.0.0/16"
subnet_name   = "subnet2"
subnet_prefix = "10.0.2.0/24"

Variable.tf

variable "rglocation" {
}
variable "rgname" {
}
variable "vnetname" {
}
variable "vnet_address_space" {
}
variable "subnet_prefix" {
}
variable "subnet_name" {
}

错误消息

Terraform will perform the following actions:
# azurerm_subnet.vnet_subnets must be replaced
-/+ resource "azurerm_subnet" "vnet_subnets" {
~ address_prefix                                 = "10.0.1.0/24" -> (known after apply)
~ address_prefixes                               = [
- "10.0.1.0/24",
+ "10.0.2.0/24",
]
~ id                                             = "" -> (known after apply)
~ name                                           = "subnet1" -> "subnet2" # forces replacement
- service_endpoint_policy_ids                    = [] -> null
- service_endpoints                              = [] -> null
# (4 unchanged attributes hidden)
}
Plan: 1 to add, 0 to change, 1 to destroy.

这是因为您基本上覆盖了您的TF文件。所以之前的子网被新的子网所破坏。为不同的资源重用相同代码的正确方法是通过工作区或在不同的文件夹中完全分离不同的设置。

但在我看来,在你的情况下,你想添加新的子网,所以你将有两个在最后。在这种情况下,应该使用count或for_each。这样,您将使用循环创建两个子网。

你的变量应该是列表:

subnet_name   = ["subnet1", "subnet2"]
subnet_prefix = ["10.0.1.0/24","10.0.2.0/24"]

然后

resource "azurerm_subnet" "vnet_subnets" {
count                = length(var.subnet_name)
name                 = var.subnet_name[count.index]
resource_group_name  = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes     = [var.subnet_prefix[count.index]]
}

最新更新