Terraform:检查蔚蓝金库中是否存在秘密

问题描述 投票:0回答:2

我正在使用 terraform 进行 Azure 部署,并尝试将 ssh 密钥存储在 Azure 保管库中。如果保管库中不存在该密钥,我想创建并存储 ssh 密钥,否则我想重用该密钥(如果存在)。

这是我尝试过的

  1. 首先独立创建保管库,因为它包含我所有的密钥
  2. 使用数据来测试密钥是否存在,但当密钥不存在时,我总是收到错误第11行。我不知道该怎么做。
  3. 注意:不得重新运行 tls_private_key,因为 ssh 密钥将会更改。
data "azurerm_resource_group" "rg_transverse" {
  name = "k8s-transversal-rg"
}


# Retrieving vault
data "azurerm_key_vault" "data-cluster-vault" {
  name                  = "k8s-transverse-vault"
  resource_group_name   = data.azurerm_resource_group.rg_transverse.name
}
data "azurerm_key_vault_secret" "data-cluster-key-public-openssh" {
  name = "cluster-key-public-openssh" 
  key_vault_id = "${data.azurerm_key_vault.data-cluster-vault.id}" 
}
output "secret_value2" {
  value = "${data.azurerm_key_vault_secret.data-cluster-key-public-openssh.value}"
}

# Creating ssh key only if doesn't exist
 resource "tls_private_key" "cluster-key" {
   count = (data.azurerm_key_vault_secret.data-cluster-key-public-openssh.value == "" ) ? 1 : 0
   algorithm   = "RSA"
   rsa_bits    = "4096"
 }

# store ssh key into vault if created
resource "azurerm_key_vault_secret" "cluster-key-public-openssh" {
  depends_on = [tls_private_key.cluster-key]
  count = (data.azurerm_key_vault_secret.data-cluster-key-public-openssh.value == "" ) ? 1 : 0
  name         = "cluster-key-public-openssh"
  value        = tls_private_key.cluster-key[count.index].public_key_openssh
  key_vault_id = data.azurerm_key_vault.data-cluster-vault.id
}

有什么想法吗? 谢谢

terraform
2个回答
0
投票

实际的 key-vault API 尚未提供“密钥存在”测试功能(除了其他答案中提到的在 C# 代码/API 中实现此目的的一些方法之外)。

恕我直言,我认为您可以通过读取密钥并捕获错误来逃脱,请参阅 Terraform 中的尝试并继续方法:

https://www.terraform.io/docs/configuration/functions/try.html

因此,您将创建您的保管库(步骤 1),然后使用 try 函数读取步骤 2 中的密钥。 注意:try(..) 的工作原理是吃掉错误并继续使用第二个参数。因此,您首先读取第一个参数中的密钥,然后在第二个参数中创建密钥。


0
投票

您可以使用 AzApi 提供程序,它具有一些列表资源功能。例如。它有一个数据源 azapi_resource_list 可以列出大多数资源。如果没有任何资源,它只会返回一个空列表,不会失败。

查看一些示例此处

所以这是对我有用的东西。它列出了订阅中的 keyvault-secrets 和 keyvault:

terraform {
  required_providers {

    azapi = {
      source = "azure/azapi"
      version = "1.15"
    }
  }
}
  
provider "azapi" {
  enable_hcl_output_for_data_source = true
}

# List keyvault secrets.
data "azapi_resource_list" "list_keyvault_secrets" {
  type                   = "Microsoft.KeyVault/vaults/secrets@2023-07-01"
  parent_id              = "/subscriptions/0000000000000000000000/resourceGroups/dummy-rg/providers/Microsoft.KeyVault/vaults/dummy-vault-name"
  response_export_values = ["*"]
}

output "keyvault_secrets" {
  value = data.azapi_resource_list.list_keyvault_secrets.output
}

# List keyvaults.
data "azapi_resource_list" "list_keyvaults" {
  type                   = "Microsoft.KeyVault/vaults@2023-07-01"
  parent_id              = "/subscriptions/0000000000000000000000/resourceGroups/dummy-rg"
  response_export_values = ["*"]
}

output "list_keyvault_secrets" {
  value = data.azapi_resource_list.list_keyvault_secrets.output
}

output "list_keyvaults" {
  value = data.azapi_resource_list.list_keyvaults.output
}

它具有一些使用

response_export_values
进行过滤等功能。

希望对你有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.