关于 azure:如何在 terraform 中继承/传递变量

How to inherit/pass on variables in terraform

我是 Terraform 的新手,在模块/子目录之间传递变量时遇到了一些问题。

我有这样的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
.
|-- main.tf
|-- variables.tf
|-- terraform.tfvars
|-- data.tf
|-- compute
      |-- main.tf
      |-- variables.tf
      |-- terraform.tfvars
|-- network
      |-- main.tf
      |-- variables.tf
      |-- terraform.tfvars

我在根目录中的 main.tf 如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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:

1
2
3
4
5
6
7
8
9
10
11
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 看起来像:

1
2
3
4
5
6
7
8
9
10
11
12
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 创建的,所以这个依赖项会起作用吗?!


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

1
2
3
4
module"network" {
  source ="./network"
  subnet_id ="{data.azurerm_subnet.agw.id}"
}

在您的网络模块中添加变量引用。还要确保声明变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
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"]
}


查看间接和直接依赖关系。在您的代码中,您可以使用创建像这样的间接依赖项 resource_group_name ="${azurerm_resource_group.test.id}" 。那么你就不需要显式定义它了。

1
2
3
4
resource"azurerm_virtual_network""test" {
  name                ="${var.vnet}"
  location            ="${var.location}"
  resource_group_name ="${var.resourcegroup}"

Terraform 本身不支持模块之间的依赖关系,所以它不会工作。您可以将该代码移到更简洁的 main 中,或者查看类似此模块依赖项的解决方法。

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

希望对你有帮助