在我们的示例中,我们正在执行以下操作:
1.红外线代理
一种。我们创建一个KV
b。我们在tf脚本中创建一个SQL数据库,包括分配管理员用户名和密码(随机生成的值)。
C。我们将用户名和密码作为秘密存储在新创建的KV中
2.数据代理
一种。我们希望将仓库中的DDL部署到我们在Infra Agent中创建的SQL数据库中。为此,我们需要使用存储在KV中的SQL数据库用户名和密码
b。为了从KV中读取机密,我们目前的想法是在步骤1中将用户名和密码插入管道参数(即在运行时进行设置),以便我们可以在其他代理之间重用这些值。
几个问题:
-这是正确的方法吗?是否应在Infra Agent tf脚本中创建KV?我们应该随机生成密码(作为秘密)吗?
-在以下情况下访问其他代理中的数据库用户名和密码的最佳做法是:
o我们无法使用变量组,因为KV和值要到运行时才能知道
o我们不能使用Key Vault任务(https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-key-vault?view=azure-devops)来从KV读取数据,因为KV名称仅在运行时才知道(通过tf vars文件)
答案 0 :(得分:1)
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 Server密码的真实来源(除非有人去手动手动重置管理员密码)。 / p>
现在,如果您想重置SQL Server密码,只需污染random_password
,强制使用新值重新创建它,这将依次更新azurerm_key_vault_secret
值,然后更新{{ 1}}密码。
这里以一些快速的HCL为例
azurerm_sql_server
这是正确的方法吗?是否应在Infra Agent tf脚本中创建KV?我们应该随机生成密码(作为秘密)吗?
这是一种明智的方法,但是请记住,计费是每个秘密,密钥或证书,并且密钥保管箱本身是免费的。建议为每个应用程序创建一个密钥库,因为访问策略只能按密钥库而不是秘密/密钥/证书来应用。
我们不能使用Key Vault Task(https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-key-vault?view=azure-devops)来从KV中读取内容,因为仅在运行时(通过tf vars文件)才知道KV名称
为什么只有在运行时才知道?这听起来像是您自己过程的限制,因为Terraform允许您在创建每个密钥库时为其指定名称。重新考虑这是否真的是一个要求,以及为什么要这么做。如果绝对有必要,并且您的密钥库名称是动态生成的,那么您可以使用terraform output
来获取管道中的密钥库名称,并使用set it as a variable during the build。
要获取密钥库名称作为输出,只需使用以下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
...
}
并运行`terraform output key_vault_name“将值写入stdout。