Terraform-Azure-VNET对等难题

Terraform-Azure-VNET对等难题,azure,terraform,terraform-provider-azure,Azure,Terraform,Terraform Provider Azure,我有点鸡和蛋的问题。想象一下多个订阅,每个订阅都有自己的VNet。我需要用一个集线器来查看所有这些,集线器也在它自己的订阅中。问题是我对每个订阅使用单独的状态文件 问题:我没有一个地形文件来构建整个环境。我为每个订阅运行一个应用程序。这意味着我需要运行两次。。在将模块/资源添加到文件以进行对等后,为每个订阅进行一次站立以使VNet就位,然后再次进行VNet对等 这可能会引起很多问题。特别是如果我运行销毁/重新应用 有更好的方法吗?如果它是整个环境的一个文件,Terraform将确保VNET在那里

我有点鸡和蛋的问题。想象一下多个订阅,每个订阅都有自己的VNet。我需要用一个集线器来查看所有这些,集线器也在它自己的订阅中。问题是我对每个订阅使用单独的状态文件

问题:我没有一个地形文件来构建整个环境。我为每个订阅运行一个应用程序。这意味着我需要运行两次。。在将模块/资源添加到文件以进行对等后,为每个订阅进行一次站立以使VNet就位,然后再次进行VNet对等

这可能会引起很多问题。特别是如果我运行销毁/重新应用

有更好的方法吗?如果它是整个环境的一个文件,Terraform将确保VNET在那里,或者我可以使用“depens_on”属性。但是,我这样做可能会破坏一切

想法:

  • 不要在地形外窥视
  • 使用一个单独的Terraform状态文件进行窥视——这可能是一个非常糟糕的主意
  • 进行两步流程;在一次运行中安装订阅/Vnet,然后在第二次运行中进行对等-可能不会很好地工作
  • 我错过了一些东西

谢谢

如果您在每个订阅中部署了每个VNet,我认为您可以执行两个步骤:一次运行安装订阅/VNet,一次运行对等。terraform对等配置将使用
别名
,对于您将引用的一个特定订阅,使用
数据
查询每个订阅中的现有资源。确保您使用的服务主体对这两个订阅都具有权限,或者对每个提供程序块使用不同的服务主体(具有关联的权限)

比如说,

provider "azurerm" {
  version         = "xxx"
  tenant_id       = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  subscription_id = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  client_id       = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  client_secret   = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  alias           = "dev"
}

provider "azurerm" {
  version         = "xxx"
  tenant_id       = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  subscription_id = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  client_id       = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  client_secret   = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  alias           = "test"
}

data "azurerm_virtual_network" "dev" {
  name                = "dev-network"
  resource_group_name = "dev-network-rg"
  provider            = "azurerm.dev"
}

data "azurerm_virtual_network" "test" {
  name                = "test-network"
  resource_group_name = "test-network-rg"
  provider            = "azurerm.test"
}

resource "azurerm_virtual_network_peering" "dev-to-test" {
  name                         = "dev-to-test"
  resource_group_name          = "${data.azurerm_virtual_network.test.resource_group_name}"
  virtual_network_name         = "${data.azurerm_virtual_network.test.name}"
  remote_virtual_network_id    = "${data.azurerm_virtual_network.test.id}"
  allow_virtual_network_access = true
  allow_forwarded_traffic      = true
  provider                     = "azurerm.dev"
}

resource "azurerm_virtual_network_peering" "test-to-dev" {
  name                         = "test-to-dev"
  resource_group_name          = "${data.azurerm_virtual_network.dev.resource_group_name}"
  virtual_network_name         = "${data.azurerm_virtual_network.dev.name}"
  remote_virtual_network_id    = "${data.azurerm_virtual_network.dev.id}"
  allow_virtual_network_access = true
  allow_forwarded_traffic      = true
  provider                     = "azurerm.test"
} 
如果您使用的是Azure CLI身份验证,则可以参考

或者,如您所想,您可以尝试在
azurerm\u virtual\u network\u peering
块中使用
dependens\u on
属性


有关更多信息,您可以参考本手册,并使用terraform部署到多个订阅。

非常好的信息。唯一的问题是每个订阅都有一个单独的状态文件。这使得每一个都是独立的。正因为如此,“依赖”是行不通的。我可以有一个“对等”状态文件,其他所有内容都在另一个状态文件中。现在,在部署TF元素之后,我正在使用Python进行窥视。我正在阅读一些资料,学习Terraform工作区。这能解决这个问题吗?是的,Terraform workspace就像一个工作环境。这可能会孤立他们的国家。您可以使用
terraform workspace new
创建新工作区,并使用
terraform workspace select
切换工作区。当在每个订阅和每个工作区中创建VNet时,您可以稍后在单独的状态文件中创建VNet对等,这是我回答中的第一个示例。问题中的任何过程?不要忘记这一点。尝试一下,我发现工作区并没有按照我预期的方式工作。。。至少我还没看到。它希望获取一个已经存在的.tf文件,并将其应用于另一个状态文件。因此,我可以将不同的变量传递给它,让它成为不同的环境,但它基于与“默认”工作区相同的.tf配置。看来我得做完全不同的配置/状态文件。
resource "azurerm_virtual_network" "spoke1-vnet" {
  provider            = "azurerm.dev"
  name                = "spoke1-vnet"
  location            = azurerm_resource_group.spoke1-vnet-rg.location
  resource_group_name = azurerm_resource_group.spoke1-vnet-rg.name
  address_space       = ["10.1.0.0/16"]

}
resource "azurerm_virtual_network_peering" "spoke1-hub-peer" {
  provider                  = "azurerm.dev"
  name                      = "spoke1-hub-peer"
  resource_group_name       = azurerm_resource_group.spoke1-vnet-rg.name
  virtual_network_name      = azurerm_virtual_network.spoke1-vnet.name
  remote_virtual_network_id = azurerm_virtual_network.hub-vnet.id

  allow_virtual_network_access = true
  allow_forwarded_traffic = true
  allow_gateway_transit   = false
  use_remote_gateways     = true
  depends_on = ["azurerm_virtual_network.spoke1-vnet", "azurerm_virtual_network.hub-vnet" , "azurerm_virtual_network_gateway.hub-vnet-gateway"]
}