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