azure - 引用模块输出的值(对象映射)

标签 azure terraform terraform-provider-azure

我正在尝试找出一种使用 Terraform 在 Azure Key Vault 中生成随 secret 钥的绝妙方法。当我想在其他模块中使用生成的 secret 时,我有点卡住了。 secret 的输出作为对象映射,我无法找出正确的语法来引用其他模块中生成的 secret 。

一些细节:

在Keyvault模块中,我生成这样的 secret ,空字符串生成一个新的 secret :

# Generate a random password
resource "random_password" "password" {
  for_each         = var.secrets
  length           = 20
  min_upper        = 2
  min_lower        = 2
  min_numeric      = 2
  min_special      = 2
  override_special = "!@#$*()-_=+[]{}<>:"
  keepers = {
    name = each.key
  }
}

# Create Azure Key Vault secrets
resource "azurerm_key_vault_secret" "secret" {
  for_each     = var.secrets
  key_vault_id = azurerm_key_vault.key-vault.id
  name         = each.key
  value        = lookup(each.value, "value") != "" ? lookup(each.value, "value") : random_password.password[each.key].result
  tags         = var.tags
  depends_on = [
    azurerm_key_vault.key-vault,
    azurerm_key_vault_access_policy.default_policy,
  ]
}

var.secrets 是一个定义如下的映射:

variable "secrets" {
  type = map(object({
    value = string
  }))
  description = "Define Azure Key Vault secrets"
  default     = {}
}

填充如下:

kv-secrets = {
  secret-x = {
    value = ""
  }
  secret-y = {
    value = ""
  }
  secret-z = {
    value = ""
  }
}

secret 被定义为 key 保管库模块的输出,如下所示:

output "key-vault-secrets" {
  value = values(azurerm_key_vault_secret.secret).*.value
}

现在假设我想在我的 terraform 项目的其他模块(可能是 PSQL DB)中使用生成的 secret :

module "psql" {
  source              = "./modules/psql"
  psql_server_name    = var.psql_server_name
  location            = var.location
  prefix              = var.prefix
  environment         = var.environment
  resource_group_name = azurerm_resource_group.rg.name

  administrator_login          = var.administrator_login
  administrator_login_password = ?module.keyvault.key-vault-secrets?
  ..
  ..
}

有谁知道如何引用生成的 secret 并将值分配给“administrator_login_password”?或者我的做法是错误的。

信用证:https://gmusumeci.medium.com/how-to-manage-azure-key-vault-with-terraform-943bf7251369

最佳答案

如果您想使用module.keyvault.key-vault-secrets["secret-x"].value'语法,那么您的输出应该是:

output "key-vault-secrets" {
  value = azurerm_key_vault_secret.secret
}

关于azure - 引用模块输出的值(对象映射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69337355/

相关文章:

Terraform "The name "xxx“用于应用服务需要全局唯一且不可用”

azure - 无法加载文件或程序集“Microsoft.WindowsAzure.ServiceRuntime,版本=2.0.0.0”

azure - 如何使用 for_each 将值从一个模块列表传递到另一个模块

python - 如何使用 Python kusto SDK 在 Kusto 中查看详细数据

google-cloud-platform - 如何解决 terraform 错误 "timeout while waiting for state to become ' 完成 : true' (last state: 'done: false' , 超时 : 10m0s)"?

kubernetes - EKS 节点组 Terraform - 为特定节点添加标签

amazon-s3 - 在 Terraform 0.9 中从远程状态迁移到后端

azure - 创建 Neo4j vm Terraform Message="从 Marketplace 镜像创建虚拟机需要请求中的计划信息

azure - azure DevOps 管道的所有作业均无需加载源代码

azure - 使用azure Active Directory注册后无法删除应用程序