Я столкнулся с проблемой зависимости между модулем 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
Буду признателен, если вы кто-нибудь можете направить меня в правильном направлении здесь.