Терраформ - Azure - VNET Пиринговая головоломка - PullRequest
0 голосов
/ 10 февраля 2020

У меня немного проблемы с курицей и яйцом. Представьте себе несколько подписок, каждая со своей VNet. Мне нужно просмотреть все это с помощью концентратора, который также имеет собственную подписку. Проблема в том, что я использую отдельный файл состояния для каждой подписки.

Проблема: У меня нет одного файла Terraform для построения всей среды. Я запускаю заявку на каждую подписку. Это означает, что мне нужно будет запустить его дважды. Один раз для режима ожидания для каждой подписки, чтобы получить VNets, затем еще раз для пиринга VNet после добавления модуля / ресурса в файл для пиринга.

Это, вероятно, вызовет много проблем. Особенно, если я запускаю команду «уничтожить / повторно».

Есть ли лучший способ сделать это? Если бы это был один файл для всей среды, Terraform удостоверился бы, что VNets были там, ИЛИ я мог бы использовать атрибут 'depen_on'. Но то, как я это делаю, может все сломать.

Мысли:

  • Пиринг ВНЕ Terraform
  • Используйте отдельный Файл состояния Terraform для пиринга - вероятно, очень плохая идея
  • Выполнить двухэтапный процесс; настроить подписку / Vnet за один прогон и вглядываясь в секунду - вероятно, не очень хорошо будет работать
  • Что-то мне не хватает.

Спасибо!

1 Ответ

1 голос
/ 11 февраля 2020

Если вы развернули каждую VNet в каждой подписке, я думаю, что вы можете сделать двухэтапный процесс: настроить подписку / Vnet за один прогон и пиринг за секунду. Конфигурация пиринга terraform будет выглядеть как this , используйте alias для одной указанной подписки c, на которую вы будете ссылаться, используйте 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 .

В качестве альтернативы, как вы думали, вы можете попробовать использовать атрибут depends_on в azurerm_virtual_network_peering block см. этот пример .

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

Для получения дополнительной информации вы можете обратиться к этим blog1 и blog2 для развертывания на нескольких подписки с терраформ.

...