我从3个用于网络,vms和数据库(在Azure中)的terraform目录开始,我将在每个目录中执行terraform apply
。
terraform文件中有一些重复项,例如每个文件中的Azure资源组。
# Create a resource group
resource "azurerm_resource_group" "resource-group" {
name = "terraform-rg"
location = "eastus"
}
因此,我现在要重组代码,以便从根目录的单个main.tf
调用全部3个,而我只执行一次terraform apply
。
但是,我对此并不陌生,如果资源组位于根目录中并且不再位于同一文件中,则不确定如何引用该资源组。
例如用于VM的vnet如下所示:
# Create a virtual network for the VM
resource "azurerm_virtual_network" "vm-vnet" {
name = "terraform-client1-vnet"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.resource-group.location
resource_group_name = azurerm_resource_group.resource-group.name
}
location
和resource_group_name
不再解析,因为azurerm_resource_group.resource-group
不再位于同一文件中,而是位于根目录的main.tf
中。
正确地重构它以便使所有问题都能解决的过程是什么?
是否有import
条语句?
答案 0 :(得分:1)
模块按以下方式工作。
假设您在以下文件夹中
modules
- resource-group
- networking
- vms
- databases
确保按照以下方式在模块resource-group
中设置正确的输出
请注意,在terraform版本v0.12 +中,也许您不再需要设置输出变量,它应该可以直接运行,但是我没有机会进行测试
在文件夹modules/resource-group
下,您可以准备文件main.tf
# Create a resource group
resource "azurerm_resource_group" "resource-group" {
name = "terraform-rg"
location = "eastus"
}
output "resource-group-location" {
value = azurerm_resource_group.resource-group.location
}
output "resource-group-name" {
value = azurerm_resource_group.resource-group.name
}
现在您可以轻松地在其他模块中引用资源
module "resource-group"{
source = "../resource-group"
...
}
# Create a virtual network for the VM
resource "azurerm_virtual_network" "vm-vnet" {
name = "terraform-client1-vnet"
address_space = ["10.0.0.0/16"]
location = module.resource-group.resource-group-location
resource_group_name = module.resource-group.resource-group-name
}