问题描述
在使用Terraform时遇到了一个问题,他想要实现以下功能,但是不知道如何操作。
他的配置如下:
local {
app_config = {
test-web = {
name = "test-web-${local.environment}"
websockets = false
subnet = "backend"
audience_subnet = "frontend"
url = "https://test-web-${local.environment}.mydomain.com"
}
test-api = {
name = "test-api-${local.environment}"
websockets = false
subnet = "backend"
audience_subnet = "frontend"
url = "https://test-api-${local.environment}.mydomain.com"
}
}
keyvault_secrets = {
aat = {
test-api = {
application_id = "1111"
client_id = "2222"
administrator_pass = "3333"
}
test-web = {
application_id = "4444"
client_id = "5555"
administrator_pass = "6666"
}
}
Demo = {
test-api = {
application_id = "1212"
client_id = "2323"
administrator_pass = "3434"
}
test-web = {
application_id = "4545"
client_id = "5656"
administrator_pass = "6767"
}
}
Dev = {
test-api = {
application_id = "9999"
client_id = "8888"
administrator_pass = "7777"
}
test-web = {
application_id = "9898"
client_id = "8787"
administrator_pass = "7676"
}
}
}
}
resource "azurerm_key_vault_secret" "app_id" {
for_each = var.apps_config
name = var.apps_config
value = each.value.application_id
key_vault_id = data.azurerm_key_vault.mykv.id
}
resource "azurerm_key_vault_secret" "client_id" {
for_each = var.apps_config
name = var.apps_config
value = each.value.client_id
key_vault_id = data.azurerm_key_vault.mykv.id
}
resource "azurerm_key_vault_secret" "admin_pass" {
for_each = var.apps_config
name = var.apps_config
value = each.value.administrator_pass
key_vault_id = data.azurerm_key_vault.mykv.id
}
用户想要实现的功能是:对于每个定义的app_config
,例如test-web
和test-api
,在运行Terraform plan
或apply
时,根据所定义的环境,创建3个密钥保管库的密钥。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案
以下是一个可能的解决方案,你可以尝试使用以下代码:
locals {
apps = keys(var.app_config)
}
resource "azurerm_key_vault_secret" "app_id" {
for_each = toset(local.apps)
name = each.key
value = var.keyvault_secrets[var.environment][each.key]["application_id"]
key_vault_id = data.azurerm_key_vault.mykv.id
}
在上面的示例中,我们首先使用locals
定义了一个变量apps
,它包含了var.app_config
的所有键。然后,我们使用for_each
循环遍历apps
,并为每个键创建一个azurerm_key_vault_secret
资源。在每个资源中,我们使用each.key
作为密钥的名称,使用var.keyvault_secrets[var.environment][each.key]["application_id"]
作为密钥的值。最后,我们指定了密钥保管库的ID。
请注意,这只是一个示例解决方案,具体的实现可能会根据你的环境和需求有所不同。你可以根据自己的情况进行调整和修改。
正文完