如何在Terraform中继承/传递变量

时间:2018-10-30 13:05:58

标签: azure terraform terraform-provider-azure

我对Terraform很陌生,在模块/子目录之间传递变量时遇到了一些问题。

我的结构如下:

.
|-- main.tf
|-- variables.tf
|-- terraform.tfvars
|-- data.tf
|-- compute
      |-- main.tf
      |-- variables.tf
      |-- terraform.tfvars
|-- network
      |-- main.tf
      |-- variables.tf
      |-- terraform.tfvars

我在根目录中的main.tf看起来像这样:

provider "azurerm" {
}


resource "azurerm_resource_group" "test" {
  name     = "${var.resourcegroup}"
  location = "${var.location}"

  tags {
    costcenter  = "costcenter_nr"
    environment = "test"
  }
}

resource "azurerm_virtual_network" "test" {
  name                = "${var.vnet}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"
  address_space       = ["10.102.2.0/23"]

  subnet {
    name           = "${var.subnet_agw}"
    address_prefix = "10.102.3.128/28"
  }
  depends_on = ["azurerm_resource_group.test"]
}

module "compute" {
  source = "./compute"
}

module "network" {
  source = "./network"
}

在网络目录中,我想为虚拟机创建网络接口。因此,网络接口取决于子网ID。虚拟机(我想在计算中使用模板创建)取决于网络接口ID。

在根目录的data.tf中,输出子网ID:

data "azurerm_subnet" "agw" {
  name                 = "${var.subnet_agw}"
  virtual_network_name = "${var.vnet}"
  resource_group_name  = "${var.resourcegroup}"

  depends_on           = ["azurerm_virtual_network.test"]
}

output "subnet_ag" {
  value = "${data.azurerm_subnet.agw.id}"
} 

如何在network / main.tf中使用该输出/变量,以便配置网络接口?

network / main.tf如下:

resource "azurerm_network_interface" "sql_server" {
  name                = "${var.sql_server}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"

  ip_configuration {
    name                          = "${var.sql_server}"
    subnet_id                     = "${????????}"
    private_ip_address_allocation = "dynamic"
  }
    depends_on = ["azurerm_resource_group.test"]
}

加上,由于依赖关系是由main.tf创建的,因此这种依赖关系会起作用吗?!

2 个答案:

答案 0 :(得分:2)

在根目录的main.tf中添加:

module "network" {
  source = "./network"
  subnet_id = "{data.azurerm_subnet.agw.id}"
}

在网络模块中添加变量引用。另外请确保声明变量:

resource "azurerm_network_interface" "sql_server" {
  name                = "${var.sql_server}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"

  ip_configuration {
    name                          = "${var.sql_server}"
    subnet_id                     = "${var.subnet_id}"
    private_ip_address_allocation = "dynamic"
  }

  depends_on = ["azurerm_resource_group.test"]
}

答案 1 :(得分:0)

研究间接和直接依赖性dependencies。在您的代码中,您可以用来创建像resource_group_name = "${azurerm_resource_group.test.id}"这样的间接依赖项。然后,您无需显式定义它。

resource "azurerm_virtual_network" "test" {
  name                = "${var.vnet}"
  location            = "${var.location}"
  resource_group_name = "${var.resourcegroup}"

Terraform本身不支持模块之间的依赖关系,因此它将无法正常工作。您可以将代码移到更干净的main中,也可以查看类似Module dependencies的变通方法。

另一种选择是在一个模块中创建所有网络内容,输出子网或NIC ID。然后将这些作为变量传递到计算模块中?

希望这会有所帮助