Невозможно сделать модуль Terraform зависимым от ресурса - PullRequest
0 голосов
/ 22 июня 2019

Я столкнулся с проблемой зависимости между модулем terraform и ресурсом. Мой модуль зависит от ресурса, но я не смог выяснить, как явно это подразумевать в Terraform. В тот момент, когда код модуля запускается до создания ресурса, от которого он зависит, это естественно приводит к ошибке.

Я просмотрел Интернет и нашел несколько дискуссий о модулях, имеющих зависимости от других модулей, включая некоторые предложения о том, как обойти отсутствие в модуле модуля "disabled_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

Ниже приведен код моего модуля для стандартных лазурных имен и виртуальных машин

     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}"
}

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

Однако проблема в том, что когда я запускаю план terraform, я получаю следующую ошибку

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

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

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

Буду признателен, если вы кто-нибудь можете направить меня в правильном направлении здесь.

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Устранена проблема путем обновления Terraform до последней версии 0.12.2. Ранее я использовал v0.11.2.

0 голосов
/ 26 июня 2019

Это на самом деле прекрасно работает в более ранней версии Terraform (я использую v0.11.13).

Обходной путь для зависимости от модуля и ресурса - использовать переменную списка с именем depen_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"]

Вы также можете сделать то же самое с ресурсами, которые существуют в отдельных модулях, если переменная depen_on находится внутри модуля.

...