无法将“ ip_configuration.0.subnet_id”解析为资源ID:无法解析Azure ID:解析module.resource.subnet_id:无效的请求URI:嵌套

时间:2020-04-05 21:15:42

标签: terraform terraform-provider-azure

对于公共IP ID的获取:“

错误:无法将“ ip_configuration.0.public_ip_address_id”解析为 资源ID:无法解析Azure ID:解析 module.resource.azurerm_public_ip.primary.id:请求的URI无效

由于网络是资源模块的嵌套模块,请在我想念的地方提出建议。

main.tf文件:

#Select provider
provider "azurerm" {
  subscription_id = "xxxxxxxxxxxxxxxxxxxxxx"
  version = "~> 2.2"
  features {}
}

module "resource" {
  source = "./modules/resource"
  resource_group_name = "DevOpsPoc-primary"
  location = "southeastasia"
}

module "network" {
  source = "./modules/network"
  virtual_network = "primaryvnet"
  subnet = "primarysubnet"
  address_space = "192.168.0.0/16"
  address_prefix = "192.168.1.0/24"
  public_ip = "backendvmpip"
  location = "southeastasia"
  primary_nic = "backendvmnic"
  #vnet_subnet_id = element(module.network.vnet_subnets, 0)
  primary_ip_conf = "backendvm"
}

资源模块main.tf文件:

resource "azurerm_resource_group" "primary" {
  name     = "var.resource_group_name"
  location = "var.location"
  tags = {
        environment = "env"
    }
}

网络模块main.tf文件:

#Create Virtual Network in Primary Resource Group
resource "azurerm_virtual_network" "primary" {
  name                = "var.virtual_network"
  resource_group_name = "module.resource.azurerm_resource_group.primary.name"
  address_space       = ["var.address_space"]
  location            = "module.resource.azurerm_resource_group.primary.location"
  tags = {
        environment = "env"
    }
}

#Create Subnet in Virtual Network
resource "azurerm_subnet" "primary" {
  name                 = "var.subnet"
  resource_group_name  = "module.resource.azurerm_resource_group.primary.name"
  virtual_network_name = "module.resource.azurerm_virtual_network.primary.name"
  address_prefix       = "var.address_prefix"
#  tags = {
#        environment = "env"
#    }
}

output "subnet_id"{
  value = "module.resource.azurerm_subnet.primary.id"
  }

#Create public IP address
resource "azurerm_public_ip" "primary" {
    name                         = "var.public_ip"
    location                     = "module.resource.azurerm_resource_group.primary.location"
    resource_group_name          = "module.resource.azurerm_resource_group.primary.name"
    allocation_method            = "Dynamic"

    tags = {
        environment = "env"
    }
}

output "public_ip_id"{
  value = "module.resource.azurerm_public_ip.id"
  }

#Create Network Interface
resource "azurerm_network_interface" "primary" {
  name                = "var.primary_nic"
  location            = "module.resource.azurerm_resource_group.primary.location"
  resource_group_name = "module.resource.azurerm_resource_group.primary.name"

  ip_configuration {
        name                           = "var.primary_ip_conf"
        subnet_id                      = "module.resource.azurerm_subnet.primary.id"
        private_ip_address_allocation  = "Dynamic"
        public_ip_address_id           = "module.resource.azurerm_public_ip.primary.id"
    }
  tags = {
        environment = "env"
    }
}

1 个答案:

答案 0 :(得分:0)

您的代码中需要纠正一些地方:

  • 您不需要在变量中使用双引号""或引用Interpolation Syntax的表达式。例如,"var.virtual_network"应该是var.virtual_network
  • 您可以直接在同一main.tf文件中引用资源,而不是从模块块中引用资源。例如,在virtual_network_name = "module.resource.azurerm_virtual_network.primary.name"块中将virtual_network_name = azurerm_virtual_network.primary.name更改为resource "azurerm_subnet"
  • 引用模块输出的语法为${module.NAME.OUTPUT},其中NAME是模块配置块的标题中给出的模块名称,OUTPUT是要引用的输出的名称。您可以在module "network"中声明资源组名称和位置,而不用在./modules/network/main.tf文件中使用它。

这是有效的代码,您可以在此document中获得更多参考:

根目录中的main.tf文件

module "resource" {
  source = "./modules/resource"
  resource_group_name = "DevOpsPoc-primary"
  location = "southeastasia"
}


module "network" {
  source = "./modules/network"
  resource_group_name = module.resource.RGname
  location = module.resource.location
  virtual_network = "primaryvnet"
  subnet = "primarysubnet"
  address_space = ["192.168.0.0/16"]
  address_prefix = "192.168.1.0/24"
  public_ip = "backendvmpip"
  primary_nic = "backendvmnic"
  #vnet_subnet_id = element(module.network.vnet_subnets, 0)
  primary_ip_conf = "backendvm"
}

目录./modules/resource

中的main.tf
variable "resource_group_name" {}
variable "location" {}

resource "azurerm_resource_group" "primary" {
  name     = var.resource_group_name
  location = var.location

}

output "RGname" {
  value = "${azurerm_resource_group.primary.name}"
}

output "location" {
    value = "${azurerm_resource_group.primary.location}"
}
在目录./modules/network

main.tf并在同一目录中声明变量。

#Create Virtual Network in Primary Resource Group
resource "azurerm_virtual_network" "primary" {
  name                = var.virtual_network
  resource_group_name = var.resource_group_name
  address_space       = var.address_space
  location            = var.location

}

#Create Subnet in Virtual Network
resource "azurerm_subnet" "primary" {
  name                 = var.subnet
  resource_group_name  = var.resource_group_name
  virtual_network_name = azurerm_virtual_network.primary.name
  address_prefix       = var.address_prefix

}

output "subnet_id"{
  value = azurerm_subnet.primary.id
  }

#Create public IP address
resource "azurerm_public_ip" "primary" {
    name                         = var.public_ip
    location                     = var.location
    resource_group_name          = var.resource_group_name
    allocation_method            = "Dynamic"

}

output "public_ip_id"{
  value = azurerm_public_ip.primary.id
  }


#Create Network Interface
resource "azurerm_network_interface" "primary" {
  name                = var.primary_nic
  location            = var.location
  resource_group_name = var.resource_group_name

  ip_configuration {
        name                           = var.primary_ip_conf
        subnet_id                      = azurerm_subnet.primary.id
        private_ip_address_allocation  = "Dynamic"
        public_ip_address_id           = azurerm_public_ip.primary.id
    }

}