Ждать \ Зависит от ресурсов в родительском модуле - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю группу ресурсов и виртуальную сеть в main.tf, и я ссылаюсь на модуль в одном файле.Проблема в том, что модуль не может получить доступ к этим ресурсам из модуля.связанный код (большая часть кода удалена, остались только соответствующие части):

main.tf:

module "worker" {
  source = "./vmLoop"

  vmName = "worker"
  prefix = "${var.reference["name"]}"
  loop   = "${var.reference["workerCount"]}"
}

resource "azurerm_resource_group" "rg" {
  name     = "${var.reference["name"]}"
  location = "${var.reference["location"]}"
}

Как мне ссылаться на эту группу ресурсов в модуле?внутри main.tf я могу сделать это: "${azurerm_resource_group.rg.name}".Мало того, что если я захочу использовать данные внутри модуля, это приведет к сбою, так как ресурс еще не создан (большая часть кода удалена, остались только соответствующие части):

Module.tf:

data "azurerm_resource_group" "rg" {
  name = "${var.prefix}"
}

Все работает нормально, если я предварительно создаю группу ресурсов \ vnet.

В шаблоне arm я бы добавил свойство dependsOn.Однако модули в terraform не поддерживают depends_on.

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Существует довольно хакерский обходной путь к этому.

Вы можете использовать зависимость_ от выходных переменных вышестоящего модуля в нисходящем потоке, НО , вы должны убедиться, что используетепеременная в последующем модуле, а не просто использовать ее в предложении depen_on.

К сожалению, это не идеальное решение, и оно может быть неприменимо в некоторых ситуациях.

0 голосов
/ 21 ноября 2018

В модуле вы должны передавать subnetID или группу ресурсов, или все, что вы создаете, как переменную.Например, в вашей основной конфигурации вы можете вызвать следующее:

module "vnet" {
  source              = "Azure/network/azurerm"
  resource_group_name = "${var.resource_group}"
  vnet_name           = "${terraform.workspace}-vnet"
  location            = "${var.arm_region}"
  address_space       = "${var.arm_network_address_space}"
  subnet_prefixes     = ["${var.arm_subnet1_address_space}", "${var.arm_subnet2_address_space}"]
  subnet_names        = ["subnet1", "subnet2"]

  tags = {
    environment = "${terraform.workspace}"
  }
}

Затем вызовите модуль vmdeploy, который использует subnetID, следующим образом:

module "vmdeploy" {
 source = "./vmdeploy"
 subnetID = "${module.vnet.vnet_subnets[0]}"
}

С помощью ссылки на другой модуль в качестве значениядля модуля vmdeploy вы создаете неявную зависимость, которую Terraform будет распознавать и включать в граф ресурсов.

В самом модуле вы определяете переменную с именем subnetID, например:

var "subnetID" {}

Это помогает?

0 голосов
/ 20 ноября 2018

Вам необходимо передать имя группы ресурсов модулю.то есть:

module "worker" {
  source = "./vmLoop"

  rg     = "${azurerm_resource_group.rg.name}"    
  vmName = "worker"
  prefix = "${var.reference["name"]}"
  loop   = "${var.reference["workerCount"]}"
}

Тогда в самом коде рабочего модуля вы должны использовать переменную rg для группы ресурсов рабочего.

...