等待\取决于模块中父级中的资源

时间:2018-11-20 12:45:53

标签: azure reference virtual-machine terraform

我在main.tf中创建资源组和vNet,并在同一文件中引用模块。问题是,模块无法从模块访问这些资源。相关代码(删除了大部分代码,只保留了相关部分):

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,一切都可以正常工作。

在手臂模板中,我将添加一个dependsOn属性。但是,terraform中的模块不支持depends_on

3 个答案:

答案 0 :(得分:1)

对此有一个相当合理的解决方法。

您可以在下游模块中的上游模块的输出变量上使用depends_on,但必须确保在下游模块中使用该变量,而不仅仅是在depends_on子句中使用它。

不幸的是,这不是理想的解决方案,在某些情况下可能不适用。

答案 1 :(得分:1)

在模块中,您应该传递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}"
  }
}

然后按如下所示使用subnetID调用vmdeploy模块:

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

通过将另一个模块引用为vmdeploy模块的值,您正在创建隐式依赖关系,Terraform将识别该依赖关系并将其包含在资源图中。

在模块本身中,您将定义一个名为subnetID的变量,如下所示:

var "subnetID" {}

有帮助吗?

答案 2 :(得分:0)

您需要将资源组的名称传递给模块。 即:

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

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

然后在工作程序模块代码本身中,将rg var用于工作程序的资源组。