azure 如何在terraform中使用`main`模块方法分离环境?

um6iljoc  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(144)

我将按照这种main模块方法来处理不同的环境(每个环境都在自己的文件夹中,并使用根文件夹中的main模块)(https://dev.to/piotrgwiazda/main-module-approach-for-handling-multiple-environments-in-terraform-1oln),但很难理解这将如何与环境之间的共享组件一起工作?示例是VNET。我在文档中列出了确切的结构,并在第一个环境已经应用后尝试应用第二个环境时遇到问题。共享资源不是第二个环境的TF状态,因此试图重新创建。如何使用这种方法拥有两个独立的环境,但却拥有共享资源?下面是我的环境x1c 0d1x,我将其应用于terraform -chdir="./clients/client1" apply,下面是main.tfclient1.tf模块的一部分,它只是部署所有资源。
client1.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.32.0"
    }
    tfe = {
      source  = "hashicorp/tfe"
      version = ">=0.43.0"
    }
  }
  backend "azurerm" {
    resource_group_name  = "utility-rg"
    storage_account_name = "XXXXXX"
    container_name       = "tfstate"
    key                  = "terraform.client1.tfstate"
  }
}


provider "azurerm" {
  features {}

}
module "main" {
  source            = "../../main"
  client_name       = "client1"
  app_subnet_prefix = "10.11.1.0/24"
  location          = "eastus"
}

main.tf1

resource "azurerm_resource_group" "main" {
  name     = var.client_name
  location = var.location
}

module "application" {
  source                                         = "../modules/app-service"
  resource_group                                 = azurerm_resource_group.main.name
  client_name                                    = var.client_name
  location                                       = var.location
  service_plan_id                                = module.shared.app_service_plan_id
  database_url                                   = module.database.database_url
  database_username                              = "@Microsoft.KeyVault(SecretUri=${module.key-vault.vault_uri}secrets/database-username)"
  database_password                              = "@Microsoft.KeyVault(SecretUri=${module.key-vault.vault_uri}secrets/database-password)"
  azure_application_insights_instrumentation_key = module.application-insights.azure_application_insights_instrumentation_key
  vault_id                                       = module.key-vault.vault_id
  azure_storage_account_name                     = module.storage-blob.azurerm_storage_account_name
  azure_storage_blob_endpoint                    = module.storage-blob.azurerm_storage_blob_endpoint
  azure_storage_account_key                      = "@Microsoft.KeyVault(SecretUri=${module.key-vault.vault_uri}secrets/storage-account-key)"
  subnet_id                                      = module.network.app_subnet_id
}

module "utilty" {
  source   = "../modules/utility"
  location = var.location
  rg_name  = "utility-rg"

}

问题是需要在shared文件夹中的环境之间共享的资源。我假设基于此语句(https://dev.to/piotrgwiazda/main-module-approach-for-handling-multiple-environments-in-terraform-1oln#:~:text=Any%20shared%20remote%20resources%20will%20be%20included%20here.),我可以以某种方式添加一些模块,这些模块将在环境之间共享并且仍然可以工作。

waxmsbnn

waxmsbnn1#

如何使用这种方法拥有两个独立的环境,但却共享资源?
你不能一次完成。你必须分两个阶段完成。
1.使用TF部署所有共享资源,并输出其ID。
1.其次,将这些资源的ID作为输入参数传递给负责这两个环境的两个TF代码库。
您可以在环境代码中使用数据源查询共享资源的详细信息。

相关问题