如何将Terraform代码重构为模块?

时间:2019-07-18 19:31:46

标签: terraform

我从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   
}

locationresource_group_name不再解析,因为azurerm_resource_group.resource-group不再位于同一文件中,而是位于根目录的main.tf中。

正确地重构它以便使所有问题都能解决的过程是什么?

是否有import条语句?

1 个答案:

答案 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   
}