b.我们在 tf 脚本中创建一个 SQL 数据库,包括分配一个管理员用户名和密码(随机生成的值)。
如果您使用的是 Key Vault,那么我假设您说的是 Azure SQL 数据库。但是目前 Terraform 仅支持为 SQL Server instance 分配管理员用户名和密码,而不是 SQL databases。
在这种情况下,我建议使用random_password 资源将值分配给azurerm_key_vault_secret,然后可以将其分配为azurerm_sql_server 管理员密码。
通过此设置,您可以确定 Key Vault 中的密码始终保持同步,并且可以被视为您的 SQL 服务器密码的真实来源(当然,除非有人手动重置管理员密码)。
现在,如果您想重置 SQL 服务器密码,只需污染 random_password,强制使用新值重新创建它,这反过来会更新 azurerm_key_vault_secret 值,然后是 azurerm_sql_server 密码。
这里有一些快速 HCL 作为示例
resource "random_password" "password" {
length = 16
special = false
}
resource "azurerm_key_vault_secret" "password_secret" {
depends_on = [<the Key Vault access policy for your infra agent which runs terraform apply>]
...
value = random_password.password.result
...
}
resource "azurerm_sql_server" "sql_server" {
...
administrator_login_password = azurerm_key_vault_secret.password_secret.value
...
}
这是正确的方法吗?是否应该在 Infra Agent tf 脚本中创建 KV?我们应该随机生成密码(作为秘密)吗?
这是一种明智的方法,但请记住,计费是按机密、密钥或证书,而且 Key Vault 本身是免费的。建议为每个应用程序创建一个 Key Vault,因为访问策略只能应用到每个 Key Vault 而不是每个密钥/密钥/证书。
我们不能使用 Key Vault 任务 (https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-key-vault?view=azure-devops) 从 KV 中读取,因为 KV 名称仅在运行时才知道(通过 tf vars 文件)
为什么这仅在运行时才知道?这听起来像是对您自己的过程的限制,因为 Terraform 允许您在创建每个 Key Vault 时为其指定一个名称。重新考虑这是否真的是一项要求以及为什么要这样做。如果确实需要并且您的 Key Vault 名称是动态生成的,那么您可以使用terraform output 在管道期间获取 Key Vault 名称并使用set it as a variable during the build。
要获取 Key Vault 名称作为输出,只需使用以下 HCL
output "key_vault_name" {
value = "${azurerm_key_vault.demo_key_vault.name}"
}
并运行 `terraform output key_vault_name" 将值写入标准输出。