Terraform中使用foreach创建多个映射变量

56次阅读
没有评论

问题描述

在使用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-webtest-api,在运行Terraform planapply时,根据所定义的环境,创建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。
请注意,这只是一个示例解决方案,具体的实现可能会根据你的环境和需求有所不同。你可以根据自己的情况进行调整和修改。

正文完