我正在尝试将已弃用的资源“azurerm_sql_server”替换为“azurerm_mssql_server”,并在这种情况下出现“无效索引”错误。
\n该情况的简化演示(使用 Terraform v0.14.5 和 v1.0.5):
\nterraform {\n required_providers {\n azurerm = {\n source = "hashicorp/azurerm"\n version = "=2.49.0"\n }\n }\n}\n\nprovider "azurerm" {\n features {}\n}\n\nlocals {\n prefix = toset(["primary", "secondary"])\n}\n\nresource "azurerm_resource_group" "rg" {\n name = "rgtest"\n location = "Canada Central"\n}\n\nresource "random_password" "sql_admin_password" {\n length = 16\n special = true\n number = true\n upper = true\n lower = true\n min_special = 2\n min_numeric = 2\n min_upper = 2\n min_lower = 2\n}\n\nresource "azurerm_sql_server" "instance" {\n for_each = local.prefix\n\n name = "${each.value}-sqlsvr"\n location = azurerm_resource_group.rg.location\n resource_group_name = azurerm_resource_group.rg.name\n\n version = "12.0"\n administrator_login = "ssadmin"\n administrator_login_password = random_password.sql_admin_password.result\n}\n\nlocals {\n primary_sql_srv = azurerm_sql_server.instance["primary"].name\n secondary_sql_srv = azurerm_sql_server.instance["secondary"].name\n}\n\n# other TF resources using local.primary_sql_srv and local.secondary_sql_srv\nRun Code Online (Sandbox Code Playgroud)\n基础设施已经部署,无意重新创建数据库服务器,因此我们需要更改资源并导入现有服务器。根据Terraform 文档,这可以通过“terraform state rm”和“terraform import”命令来完成。
\n所以,
\n...\n\nresource "azurerm_mssql_server" "instance" {\n...\nlocals {\n primary_sql_srv = azurerm_mssql_server.instance["primary"].name\n secondary_sql_srv = azurerm_mssql_server.instance["secondary"].name\n}\n# other TF resources using local.primary_sql_srv and local.secondary_sql_srv\nRun Code Online (Sandbox Code Playgroud)\nterraform.exe state rm azurerm_sql_server.instance[`\\`"primary`\\`"]\nterraform.exe state rm azurerm_sql_server.instance[`\\`"secondary`\\`"]\nRun Code Online (Sandbox Code Playgroud)\n> terraform.exe import azurerm_mssql_server.instance[`\\`"primary`\\`"] "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgtest/providers/Microsoft.Sql/servers/primary-sqlsvr"\n\nazurerm_mssql_server.instance["primary"]: Importing from ID "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgtest/providers/Microsoft.Sql/servers/primary-sqlsvr"...\nazurerm_mssql_server.instance["primary"]: Import prepared!\n Prepared azurerm_mssql_server for import\nazurerm_mssql_server.instance["primary"]: Refreshing state... [id=/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgtest/providers/Microsoft.Sql/servers/primary-sqlsvr]\n\nImport successful!\n\nThe resources that were imported are shown above. These resources are now in\nyour Terraform state and will henceforth be managed by Terraform.\nRun Code Online (Sandbox Code Playgroud)\n当前状态列表
\n\xe2\x9d\xaf terraform.exe state list\n\nazurerm_mssql_server.instance["primary"]\nazurerm_resource_group.rg\nrandom_password.sql_admin_password\nRun Code Online (Sandbox Code Playgroud)\n> terraform.exe import azurerm_mssql_server.instance[`\\`"secondary`\\`"] "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgtest/providers/Microsoft.Sql/servers/secondary-sqlsvr"\n\nazurerm_mssql_server.instance["secondary"]: Importing from ID "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgtest/providers/Microsoft.Sql/servers/secondary-sqlsvr"...\nazurerm_mssql_server.instance["secondary"]: Import prepared!\n Prepared azurerm_mssql_server for import\nazurerm_mssql_server.instance["secondary"]: Refreshing state... [id=/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rgtest/providers/Microsoft.Sql/servers/secondary-sqlsvr]\n\nError: Invalid index\n\n on C:\\Work\\Projects\\2021\\20210812RenameResource\\t1env\\main.tf line 49, in locals:\n 49: secondary_sql_srv = azurerm_mssql_server.instance["secondary"].name\n |----------------\n | azurerm_mssql_server.instance is object with 1 attribute "primary"\n\nThe given key does not identify an element in this collection value.\nRun Code Online (Sandbox Code Playgroud)\n第二次导入的状态刷新触及本地块并由于没有“辅助”服务器资源而失败。
\n所以对我来说,这是一个死锁,我无法导入“辅助”服务器资源,因为刷新错误,而刷新错误是由于缺少“辅助”服务器资源引起的。
\n我能想到的两种方法:
\n有什么想法吗?谢谢。
\nterraform import这是0.13 版本中引入的一个错误。在执行期间terraform import,它将尝试local根据不存在的状态验证包含资源命名空间的配置中的变量。基本上有三种解决方法:
这确实不是一个很好的选择,因为版本存储在状态中,并且您可能无法针对与更高版本同步的状态执行 terraform CLI 命令。
也确实不是一个很好的选择,因为这可能会破坏状态和/或导致其他明显的畸形问题。
locals和引用变量值的任何代码local。这就是我最终使用的。/* ... */您可以在引用导入资源的导出资源属性的相关样式中进行多行注释locals,并且还需要在引用变量的配置的任何其他区域中执行此操作local。导入完成后,您可以取消注释代码。
| 归档时间: |
|
| 查看次数: |
2090 次 |
| 最近记录: |