【发布时间】:2021-03-16 12:11:31
【问题描述】:
我有以下 Terraform 代码,其中 Terraform 从密钥库中获取 sql 管理员密码。当我在密钥库中更改管理员登录名和密码,然后再次运行 terraform 更新 sql server 时,它会破坏 sql 数据库和 sql server。
这是标准程序还是我可以改变这种行为?可以理解,在生产环境中重新创建资源实际上并不可行。我知道生命周期钩子可以防止删除资源,但如果我是正确的,这样的事情会破坏管道。
data "azurerm_key_vault_secret" "sql_admin_user_secret" {
name = var.sql_admin_user_secret_name
key_vault_id = data.azurerm_key_vault.key_vault.id
}
data "azurerm_key_vault_secret" "sql_admin_password_secret" {
name = var.sql_admin_password_secret_name
key_vault_id = data.azurerm_key_vault.key_vault.id
}
resource "azurerm_sql_server" "sql_server" {
name = var.sql_server_name
resource_group_name = var.resource_group_name
location = var.location
version = var.sql_server_version
administrator_login = data.azurerm_key_vault_secret.sql_admin_user_secret.value
administrator_login_password = data.azurerm_key_vault_secret.sql_admin_password_secret.value
}
resource "azurerm_sql_database" "sql_database" {
name = var.sql_database_name
resource_group_name = var.resource_group_name
location = var.location
server_name = azurerm_sql_server.sql_server.name
edition = var.sql_edition
requested_service_objective_name = var.sql_service_level
}
我可以添加类似这样的内容,但这只会阻止销毁并分别忽略这些字段中的更改。同样,这不是一个真正的选择。
lifecycle {
prevent_destroy = true
ignore_changes = ["administrator_login", "administrator_login_password"]
}
更新:
工作方式是永远不要更新administrator_login。 administrator_login_password 可以单独更新,不会导致实例重新创建。
【问题讨论】:
-
能否也分享一下计划输出? github.com/terraform-providers/terraform-provider-azurerm/blob/… 在
administrator_login_password参数上没有ForceNew,所以这不应该仅仅因为密码被更新而发生。 -
我想我现在更好地理解了这个问题。 administrator_login 和 administrator_login_password 都已更新,因此需要重新创建资源。仅更新密码并不会强制重新创建资源。谢谢你的解释!
-
Nebulastic,如果您觉得有帮助,请标记答案。
标签: azure azure-sql-database terraform azure-sql-data-warehouse