Terraform 地形不断破坏现有资源

Terraform 地形不断破坏现有资源,terraform,azure-rm,Terraform,Azure Rm,我正在尝试调试我的Terraform脚本为什么不工作。由于未知原因,Terraform一直在破坏我的MySQL数据库,然后重新创建它 以下是执行计划的输出: \azurerm\u mysql\u server.test01将被销毁 -资源“azurerm\u mysql\u服务器”“test01”{ -管理员\u login=“me”->null -自动增长启用=真->空 -备份保留天数=7->null -create_mode=“Default”->null -fqdn=“db-test01.

我正在尝试调试我的
Terraform
脚本为什么不工作。由于未知原因,
Terraform
一直在破坏我的MySQL数据库,然后重新创建它

以下是执行计划的输出:

\azurerm\u mysql\u server.test01将被销毁
-资源“azurerm\u mysql\u服务器”“test01”{
-管理员\u login=“me”->null
-自动增长启用=真->空
-备份保留天数=7->null
-create_mode=“Default”->null
-fqdn=“db-test01.mysql.database.azure.com”->null
-地理位置冗余备份启用=假->空
-id=“/subscriptions/8012-4035-b8f3-860f8cb1119e/resourceGroups/providers/Microsoft.DBforMySQL/servers/db-test01”->null
-基础结构\u加密\u已启用=false->null
-location=“westeurope”->null
-name=“db-test01”->null
-公共网络访问已启用=真->空
-资源组\u name=“生产rg”->空
-sku_name=“B_Gen5_1”->空
-ssl_enforcement=“Disabled”->null
-ssl\u强制\u已启用=false->null
-ssl\u minimal\u tls\u version\u exforced=“TLSEnforcementDisabled”->null
-存储器\u mb=51200->null
-标记={}->null
-version=“8.0”->null
-存储配置文件{
-auto_grow=“Enabled”->null
-备份保留天数=7->null
-geo_redundant_backup=“Disabled”->null
-存储器\u mb=51200->null
}
-超时{}
}
#将创建module.databases.module.test.azurerm\u mysql\u server.test01
+资源“azurerm\u mysql\u服务器”“test01”{
+管理员\u login=“我”
+管理员登录密码=(敏感值)
+自动增长启用=真
+备份保留天数=7天
+创建模式=“默认”
+fqdn=(应用后已知)
+地理位置冗余备份已启用=错误
+id=(应用后已知)
+基础结构加密已启用=错误
+地点=“西欧”
+name=“db-test01”
+公共网络访问已启用=真
+资源组名称=“生产rg”
+sku_name=“B_Gen5_1”
+ssl_强制=(应用后已知)
+ssl\u强制执行\u启用=错误
+ssl\u minimal\u tls\u version\u exforced=“TLSEnforcementDisabled”
+存储容量(mb=51200)
+version=“8.0”
+存储配置文件{
+自动增长=(应用后已知)
+备份\保留\天数=(应用后已知)
+geo_冗余_备份=(应用后已知)
+存储_mb=(应用后已知)
}
}
据我所知,一切都完全一样。为了防止这种情况,我还手动执行了
terraform导入
,将状态与远程状态同步

在my main.tf中定义的实际资源

resource“azurerm\u mysql\u服务器”“test01”{
name=“db-test01”
地点=“西欧”
资源组名称=var.rg
管理员\u login=“我”
管理员\u登录\u密码=var.root\u密码
sku_name=“B_Gen5_1”
存储容量(mb=51200)
version=“8.0”
自动增长启用=真
备份保留天数=7天
地理位置冗余备份已启用=错误
基础结构加密已启用=错误
公共网络访问已启用=真
ssl\u强制执行\u启用=错误
}
另一件奇怪的事情是,下面的命令将输出所有实际上是同步的

➜  土工土:(开发)✗ 地形平面图--仅刷新
azurerm_mysql_server.test01:正在刷新状态。。。[id=/subscriptions/8012-4035-b8f3-860f8cb1119e/resourceGroups/firstklas production rg/providers/Microsoft.DBforMySQL/servers/db-test01]
没有变化。您的基础结构仍然与配置相匹配。
实际导入后,即使导入状态全部处于以下状态,仍会发生相同的情况:

➜  terraform git:(develop) ✗ terraform import azurerm_mysql_server.test01 /subscriptions/8012-4035-b8f3-860f8cb1119e/resourceGroups/production-rg/providers/Microsoft.DBforMySQL/servers/db-test01
azurerm_mysql_server.test01: Importing from ID "/subscriptions/8012-4035-b8f3-860f8cb1119e/resourceGroups/production-rg/providers/Microsoft.DBforMySQL/servers/db-test01"...
azurerm_mysql_server.test01: Import prepared!
  Prepared azurerm_mysql_server for import
azurerm_mysql_server.test01: Refreshing state... [id=/subscriptions/8012-4035-b8f3-860f8cb1119e/resourceGroups/production-rg/providers/Microsoft.DBforMySQL/servers/db-test01]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
我能做些什么来防止这种破坏?甚至弄清楚为什么会触发真正的破坏?这在多个azure实例上发生

注意:订阅ID是伪造的,所以不要担心

最好的,
Pim

您的计划输出显示Terraform看到两个不同的资源地址:

  # azurerm_mysql_server.test01 will be destroyed
  # module.databases.module.test.azurerm_mysql_server.test01 will be created
请注意,要创建的模块位于嵌套模块中,而不是根模块中

如果您的目的是将此对象导入上面显示的需要创建的地址,则需要在
terraform import
命令中指定此完整地址:

terraform import 'module.databases.module.test.azurerm_mysql_server.test01' /subscriptions/8012-4035-b8f3-860f8cb1119e/resourceGroups/production-rg/providers/Microsoft.DBforMySQL/servers/db-test01
terraform import
命令告诉terraform将现有远程对象绑定到特定的terraform地址,因此在使用它时,需要小心指定要绑定到的正确terraform地址


在您的例子中,您告诉Terraform将对象绑定到根模块中的一个假设的
资源“azurerm\u mysql\u server”“test01”
块,但是您的配置没有这样的块,因此当您运行
Terraform plan
Terraform时,您假设要删除该对象,因为删除一个
资源
块是我们通常告诉Terraform我们打算删除某个东西的方式。

产生t的代码是什么