在第一次应用terraform时,此配置当前成功地创建了一个密钥保管库,并使用随机资源创建的值从列表“secrets”中填充secrets。
此后每次运行此配置时都会抛出此错误:用户名错误:ID为“www.example.com“的资源https://testingkeyvault.vault.azure.net/secrets/Password1/3e4cdc60c7e12345a228fd4250b58191已经存在-要通过Terraform管理此资源,需要将其导入State。有关详细信息,请参阅“azurerm_key_vault_secret”的资源文档。
variable "secrets" {
type = list(string)
default = [
"Password1",
"Password2",
"Password3",
"Password4"
]
}
data "azurerm_client_config" "current" {
provider = azurerm.PlatformManagement
}
data "azurerm_key_vault" "existing" {
provider = azurerm.PlatformManagement
name = var.KeyVaultName
resource_group_name = var.KeyVault_Rg_Name
depends_on = [azurerm_key_vault.pman-vault]
}
resource "azurerm_key_vault" "pman-vault" {
provider = azurerm.PlatformManagement
name = var.KeyVaultName
location = var.Location
resource_group_name = var.KeyVault_Rg_Name
enabled_for_disk_encryption = true
tenant_id = data.azurerm_client_config.current.tenant_id
soft_delete_retention_days = 7
purge_protection_enabled = false
sku_name = "standard"
enable_rbac_authorization = true
data "azurerm_key_vault_secret" "existing-secrets" {
count = length(var.secrets)
name = var.secrets[count.index]
key_vault_id = azurerm_key_vault.pman-vault.id
depends_on = [azurerm_key_vault_secret.pman-secrets]
}
resource "random_password" "password" {
count = var.create_secrets ? length(var.secrets) : 0
length = 15
special = true
override_special = "!@#$%&*()-_=+[]{}<>:?"
}
resource "azurerm_key_vault_secret" "pman-secrets" {
count = var.create_secrets ? length(var.secrets) : 0
name = var.secrets[count.index]
value = random_password.password[count.index].result
key_vault_id = azurerm_key_vault.pman-vault.id
lifecycle {
prevent_destroy = true
}
depends_on = [azurerm_key_vault.pman-vault]
}
我期待的结果是,它能够检测到它已经创建并存在于密钥库中的密码,并使terraform代码等幂运行。我做错了什么,我能做些什么来实现这一目标?
1条答案
按热度按时间xcitsw881#
我尝试配置Terraform - Azure Key Vault Secrets创建,但不是幂等的,我能够成功配置要求。
Terraform配置的问题在于,您在
azurerm_key_vault_secret
资源上使用了count
属性,而没有指定for_each
参数。这意味着Terraform将为secrets
变量中的每个项目创建一个新的秘密,即使秘密已经存在于密钥库中。要使Terraform配置具有等幂性,您需要使用
for_each
参数来指定在创建秘密时要覆盖的数据源。在本例中,您希望覆盖azurerm_key_vault_secret.existing-secrets
数据源。下面是一个修改后的Terraform配置版本,它是幂等的:
我的地形配置:
输出:
Terraform apply:
再次重复命令
Terraform apply: