【问题标题】:Terraform - Azure - VNET Peering ConundrumTerraform - Azure - VNET 对等互连难题
【发布时间】:2020-05-26 00:16:55
【问题描述】:

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

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

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

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

想法:

  • 在 Terraform 之外进行窥视
  • 使用单独的 Terraform 状态文件进行对等 - 可能是个非常糟糕的主意
  • 执行两步流程;在一次运行中设置订阅/Vnet,然后在第二次中对等 - 可能不会很好地工作
  • 我缺少一些东西。

谢谢!

【问题讨论】:

    标签: azure terraform terraform-provider-azure


    【解决方案1】:

    如果您已在每个订阅中部署了每个 VNet,我认为您可以执行两步过程:一次运行设置订阅/Vnet,然后在第二次进行对等互连。 terraform 对等配置类似于this,使用alias 表示您将引用的一个特定订阅,使用data 查询每个订阅中的现有资源。确保您使用的服务主体具有对两个订阅的权限,或者为每个提供程序块使用不同的服务主体(具有相关权限)。

    例如,

    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 身份验证,您可以参考this

    或者,如您所想,您可以尝试在azurerm_virtual_network_peering 块中使用depends_on 属性,参考this example

    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"]
    }
    

    有关更多信息,您可以参考此 blog1blog2 以使用 terraform 部署到多个订阅。

    【讨论】:

    • 很棒的信息。唯一的问题是每个订阅都有一个单独的状态文件。这允许每个人都是独立的。因为那个'depends_on'不起作用。我可以在另一个状态文件中有一个“对等”状态文件和其他所有内容。现在,我正在部署 TF 元素后使用 Python 进行对等。
    • 只是做一些阅读,我正在学习 Terraform 工作区。这能解决这个问题吗?
    • 是的,Terraform 工作区就像一个工作环境。它可以隔离他们的状态。您可以使用terraform workspace new 来创建一个新的工作空间,并使用terraform workspace select 来切换工作空间。在每个订阅和每个工作区中创建 VNet 后,您可以稍后在单独的状态文件中创建 VNet 对等互连,作为我回复中的第一个示例。
    • 问题中有任何进程吗?
    • 没有忘记这一点。尝试一下,我发现工作空间并没有按我预期的方式工作......至少我还没有看到它。它想要获取一个已经存在的 .tf 文件并将其应用于不同的状态文件。所以我可以将不同的变量传递给它,让它成为一个不同的环境,但它基于与“默认”工作区相同的 .tf 配置。看起来我必须做完全不同的配置/状态文件。
    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2020-11-09
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2021-11-08
    相关资源
    最近更新 更多