【问题标题】:Unable to make Terraform module dependent on resource无法使 Terraform 模块依赖于资源
【发布时间】:2019-11-04 23:26:04
【问题描述】:

我面临 terraform 模块和资源之间的依赖问题。我的模块依赖于资源,但我无法找到如何在 Terraform 中明确暗示这一点。在创建它所依赖的资源之前运行模块代码,这自然会导致错误。

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

我尝试了以下建议,但无济于事

https://github.com/hashicorp/terraform/issues/16983

https://devops.stackexchange.com/questions/6163/how-to-make-terraform-modules-wait-for-resources-to-be-created-in-place-of-using

下面是我的标准 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}"
}

我需要在不同的子网中启动虚拟机,所以我认为如果我将网络接口模板也添加到我的模块中并在调用模块时提供适当的子网 ID,这将是有益的。

但是问题是当我运行 terraform plan 时出现以下错误

module.WinWeb01.var.subnetId: Resource 'azurerm_subnet.subnets' not found for variable 'azurerm_subnet.subnets.1.id'

模块在子网实际创建之前寻找子网ID(子网代码在主模板文件中)。我看到很少有帖子建议使用depends_on 变量,但这在我的情况下不起作用。

https://medium.com/@bonya/terraform-adding-depends-on-to-your-custom-modules-453754a8043e

如果有人能在这里指导我正确的方向,将不胜感激。

【问题讨论】:

  • 错误信息指出资源azurerm_subnet.subnets不存在,根据贴出的代码是这样的。

标签: terraform terraform-provider-azure


【解决方案1】:

通过将 Terraform 升级到最新的 v 0.12.2 解决了这个问题。我之前使用的是 v0.11.2。

【讨论】:

    【解决方案2】:

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

    模块和资源依赖的解决方法是使用一个名为 depends_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}"
    }
    

    ma​​in.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"]
    

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

    【讨论】:

    • 对于 0.12.2 版本,我不需要 depends_on 变量。没有它它只是工作。事实上,如果你现在使用“depends_on”作为变量名,terraform 不喜欢。它会抛出此错误66: variable "depends_on" { The variable name "depends_on" is reserved due to its special meaning inside module blocks.
    • 不错!我必须尽快升级到 012.x 才能摆脱这种解决方法。
    猜你喜欢
    • 2020-09-16
    • 2023-02-23
    • 2020-02-05
    • 2021-07-09
    • 2020-03-17
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多