首页 > 解决方案 > 如何将 Terraform 代码重构为模块?

问题描述

我从 3 个单独的 terraform 目录开始,用于网络、vms 和数据库(在 Azure 中),我会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   
}

locationandresource_group_name不再解析,因为不再azurerm_resource_group.resource-group在同一个文件中,而是在main.tf根目录中。

正确重构它以使一切都解决的过程是什么?

import说法吗?

标签: terraform

解决方案


这些模块按以下方式工作。

假设您有以下文件夹

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   
}

推荐阅读