terraform - 如何将 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
}
location
andresource_group_name
不再解析,因为不再azurerm_resource_group.resource-group
在同一个文件中,而是在main.tf
根目录中。
正确重构它以使一切都解决的过程是什么?
有import
说法吗?
解决方案
这些模块按以下方式工作。
假设您有以下文件夹
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
}
推荐阅读
- macos - Mach-O 平台上的库版本控制
- tensorflow - cifar100 数据集由重复图像组成?
- ethereum - 安全地公开您的网络,让任何人都可以访问您的智能合约
- php - Nginx index.html 而不是我自己的 index.html
- php - 更新表中 $_SESSION 用户名的正确方法
- jenkins - Jenkins输入参数验证
- django - 带有序列化程序的 Django REST 框架 CurrentUserDefault()
- android - 如何找到edx android app下载的课程视频的标题。?
- swift - MTKView 委托不起作用
- windows - C930 网络摄像头不显示 h264 流