无法使Terraform模块依赖于资源

无法使Terraform模块依赖于资源,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,我面临着terraform模块和资源之间的依赖性问题。我的模块依赖于一个资源,但我还没有找到如何在Terraform中显式地暗示这一点。在创建模块代码所依赖的资源之前运行模块代码时,这自然会导致错误 我浏览了互联网,发现很少有关于模块依赖于其他模块的讨论,包括一些关于如何解决模块中缺乏“依赖”的建议。但是,对于模块依赖于资源的情况,我还没有找到任何建议/解决方法 我试过下面的建议,但没用 下面是我的标准azure nic和vm模块的代码 resource "azurerm_netw

我面临着terraform模块和资源之间的依赖性问题。我的模块依赖于一个资源,但我还没有找到如何在Terraform中显式地暗示这一点。在创建模块代码所依赖的资源之前运行模块代码时,这自然会导致错误

我浏览了互联网,发现很少有关于模块依赖于其他模块的讨论,包括一些关于如何解决模块中缺乏“依赖”的建议。但是,对于模块依赖于资源的情况,我还没有找到任何建议/解决方法

我试过下面的建议,但没用

下面是我的标准azure nic和vm模块的代码

     resource "azurerm_network_interface" "nic" {
      name                = "${var.nicName}"
      resource_group_name = "${var.rgName}"
      location            = "${var.rgLocation}"

      ip_configuration {
        name                          = "vm-nic-configuration"
        subnet_id                     = "${var.subnetId}"
        private_ip_address_allocation = "dynamic"
      }
    }


    resource "azurerm_virtual_machine" "vms" {
      name                  = "${var.vmHostName}"
      location              = "${var.rgLocation}"
      resource_group_name   = "${var.rgName}"
      network_interface_ids = ["${azurerm_network_interface.nic.id}"]

      vm_size                          = "${var.vmSize}"
      delete_os_disk_on_termination    = true
      delete_data_disks_on_termination = true

      storage_image_reference {
        publisher = "MicrosoftWindowsServer"
        offer     = "WindowsServer"
        sku       = "2016-Datacenter"
        version   = "latest"
      }

      storage_os_disk {
        name              = "${var.diskVol01Name}"
        caching           = "ReadWrite"
        create_option     = "FromImage"
        managed_disk_type = "Standard_LRS"
      }

      os_profile {
        computer_name  = "${var.vmHostName}"
        admin_username = "${var.vmUserName}"
        admin_password = "${var.vmAdminPwd}"
      }

      os_profile_windows_config {
        provision_vm_agent        = true
        enable_automatic_upgrades = true
      }

      depends_on = ["azurerm_network_interface.nic"]  
    }
这就是我在主模板文件中使用模块的方式

module "WinWeb01" {
  source = "../modules/vmsetup"

  nicName    = "${var.prefix}-web-nic01"
  rgName     = "${azurerm_resource_group.rg.name}"
  rgLocation = "${azurerm_resource_group.rg.location}"
  vmHostName = "${var.prefix}-web01"
  vmUserName = "vmAdmin"

  vmAdminPwd           = "${data.azurerm_key_vault_secret.vmPassword.0.value}"
  availabilitySetId    = "${azurerm_availability_set.webvmavailset.id}"
  vmSize               = "${var.vmSize}"
  diskVol01Name        = "${var.prefix}-web01-disk01"
  availabilitySetCount = "${var.availabilitySetCount}"
  subnetId             = "${azurerm_subnet.subnets.1.id}"
}
我需要在不同的子网中启动VM,因此我认为如果我也向模块中添加网络接口模板,并在调用模块时提供适当的子网ID,这将是有益的

然而,问题是当我运行terraform plan时,我得到以下错误

module.WinWeb01.var.subnetId: Resource 'azurerm_subnet.subnets' not found for variable 'azurerm_subnet.subnets.1.id'
在实际创建子网之前,模块正在查找子网id(子网代码位于主模板文件中)。我看到很少有帖子建议使用depens_on变量,但这在我的案例中不起作用


如果您能在这里为我指引正确的方向,我将不胜感激

通过将Terraform升级到最新版本0.12.2解决了该问题。我以前使用的是v0.11.2。

这实际上在Terraform的早期版本中运行良好(我正在运行v0.11.13)

模块和资源依赖关系的解决方法是使用名为dependens\u on的列表变量,并将其从根级别传递到不同的模块,只要模块文件夹中也包含相同的变量:

variable "depends_on" {
    default = []
    type = "list"
}
例如,如果在创建CosmosDB帐户之前需要创建资源组之类的资源,则可以执行以下操作:

rg.tf

resource "azurerm_resource_group" "resource_group_name" {
  name     = "rg-${var.environment}-${var.project_name}"
  location = "${var.resource_location}"
}
main.tf

module "cosmosdb" {
  source            = "./modules/cosmosdb"
  resource_group    = "${azurerm_resource_group.resource_group_name.name}"
  project_name      = "${var.project_name}"
  depends_on = ["azurerm_resource_group.resource_group_name"]

您也可以对存在于单独模块中的资源执行相同操作,只要Dependes_on变量位于模块内部。

错误消息说明资源
azurerm_子网。子网不存在,根据发布的代码,这是正确的。对于版本0.12.2,我不需要Dependes_on变量。没有它就行了。事实上,terraform不喜欢现在使用“depends_on”作为变量名。它抛出了这个错误
66:variable“dependens_on”{变量名“dependens_on”是保留的,因为它在模块块中有特殊的含义。
Nice!我很快就要升级到012.x才能摆脱这个解决方法。