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"] } |
查看间接和直接依赖关系。在您的代码中,您可以使用创建像这样的间接依赖项
1 2 3 4 | resource"azurerm_virtual_network""test" { name ="${var.vnet}" location ="${var.location}" resource_group_name ="${var.resourcegroup}" |
Terraform 本身不支持模块之间的依赖关系,所以它不会工作。您可以将该代码移到更简洁的 main 中,或者查看类似此模块依赖项的解决方法。
另一种选择是在一个模块中创建所有网络内容,输出子网或 NIC ID。然后将这些作为变量传递给计算模块?
希望对你有帮助