【问题标题】:Azure DevOps terraform and AKVAzure DevOps terraform 和 AKV
【发布时间】:2019-09-27 13:33:16
【问题描述】:

在我们的例子中,我们正在执行以下操作:
1. 基础设施代理
一种。我们创建一个 KV
湾。我们在 tf 脚本中创建一个 SQL 数据库,包括分配一个管理员用户名和密码(随机生成的值)。
C。我们将用户名和密码作为秘密存储在新创建的 KV 中
2. 数据代理
一种。我们希望将 DDL 从存储库部署到我们在 Infra Agent 中创建的 SQL 数据库中。我们需要使用存储在 KV 中的 SQL 数据库用户名和密码来执行此操作
湾。为了从 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 文件)

【问题讨论】:

    标签: azure azure-devops terraform devops


    【解决方案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 服务器密码的真实来源(当然,除非有人手动重置管理员密码)。

    现在,如果您想重置 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" 将值写入标准输出。

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2022-01-04
      • 2020-08-20
      • 2019-03-07
      • 1970-01-01
      • 2019-08-17
      • 2019-10-13
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多