我在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
。
答案 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用于工作程序的资源组。