Ссылочное значение на выходе модуля (карта объектов)

#azure #terraform #terraform-provider-azure

Вопрос:

Я пытаюсь найти отличный способ создания рандомизированных секретов в хранилище ключей Azure с использованием Terraform. Где я немного застрял, так это когда я хочу использовать сгенерированные секреты в других модулях. Выходные данные секретов отображаются в виде карты объектов, и я не могу найти правильный синтаксис для ссылки на сгенерированные секреты в других модулях.

Для некоторых подробностей:

В модуле Keyvault я генерирую такие секреты, пустые строки генерируют новый секрет:

 # 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 = ""
  }
}

 

Секреты определяются как выходные данные для модуля хранилища ключей, такого как этот:

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

Теперь предположим, что я хотел бы использовать сгенерированный секрет в других модулях моего проекта terraform, возможно, в базе данных PSQL:

 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?
  ..
  ..
}
 

Кто-нибудь знает, как ссылаться на сгенерированный секрет, присваивая значение «login_password»? Или я подхожу к этому неправильно.

кредит: https://gmusumeci.medium.com/how-to-manage-azure-key-vault-with-terraform-943bf7251369

Комментарии:

1. Что не так с вашим нынешним подходом? Какие ошибки вы получаете?

2. Я предполагаю, что это поиск правильного синтаксиса для извлечения определенного секрета из модуля’. keyvault.вывод секретов хранилища ключей. например, я хотел бы сделать что-то вроде этого: ‘administrator_login_password = модуль. keyvault.ключ-хранилище-секреты[«секрет-x»].значение’

Ответ №1:

Если вы хотите использовать module.keyvault.key-vault-secrets["secret-x"].value' синтаксис, то ваш вывод должен быть:

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

Комментарии:

1. Хорошо, все сработало так, как задумывалось. Большое спасибо!