如何在不同文件夹中调用Terraform对象

41次阅读
没有评论

问题描述

在使用Terraform时,有一个需求是在一个名为”infrastructure”的文件夹中引用一个名为”VPN”的文件夹中的VNET Gateway。这两个文件夹都使用托管在Azure Blob存储中的不同状态文件。
用户尝试使用通常的方法,如”module.vnet_gateway.id”或”data.azurerm_vnet_gateway.id”,但在这种情况下无法正常工作。
用户考虑通过名称引用VNET Gateway,并将其ID作为输出,但不确定这是否是最佳方法。
用户还了解到可以使用远程状态(remote-state),但在Azure上尚未找到一个好的示例来实现这一点。
用户希望得到一些指导或示例,以便朝正确的方向前进。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

使用远程状态文件并从不同的状态模板中引用状态是我会选择的方法。您需要在需要共享的资源中添加一个输出,并配置远程状态存储、访问控制和安全性。
以下是在AzureRM中设置远程后端的示例URL:https://www.terraform.io/docs/backends/types/azurerm.html
在这个示例中,您需要执行以下步骤:
1. 在”infrastructure”文件夹中的Terraform配置文件中,添加一个输出来共享VNET Gateway的ID。例如:

output "vnet_gateway_id" {
  value = azurerm_vnet_gateway.vnet_gateway.id
}
  1. 在”VPN”文件夹中的Terraform配置文件中,配置远程状态存储。例如:
terraform {
  backend "azurerm" {
    storage_account_name = "your_storage_account_name"
    container_name       = "your_container_name"
    key                  = "your_key"
  }
}
  1. 在”VPN”文件夹中的Terraform配置文件中,使用远程状态来引用VNET Gateway的ID。例如:
data "terraform_remote_state" "infrastructure" {
  backend = "azurerm"
  config = {
    storage_account_name = "your_storage_account_name"
    container_name       = "your_container_name"
    key                  = "your_key"
  }
}

resource "azurerm_vpn_connection" "vpn_connection" {
  vnet_gateway_id = data.terraform_remote_state.infrastructure.outputs.vnet_gateway_id
  # 其他配置
}

在上面的示例中,我们首先在”infrastructure”文件夹中的Terraform配置文件中添加了一个输出来共享VNET Gateway的ID。然后,在”VPN”文件夹中的Terraform配置文件中,我们配置了远程状态存储,并使用远程状态来引用VNET Gateway的ID。
请注意,您需要将示例中的”your_storage_account_name”、”your_container_name”和”your_key”替换为实际的存储帐户名称、容器名称和密钥。

方案2

使用远程状态需要配置和管理远程状态存储,并确保访问控制和安全性设置正确。如果您不熟悉远程状态的概念或不想配置远程状态存储,可以考虑将VNET Gateway的ID作为输出,并手动将其传递给”VPN”文件夹中的资源。
以下是一个示例:
在”infrastructure”文件夹中的Terraform配置文件中,添加一个输出来共享VNET Gateway的ID。例如:

output "vnet_gateway_id" {
  value = azurerm_vnet_gateway.vnet_gateway.id
}

然后,在”VPN”文件夹中的Terraform配置文件中,手动引用VNET Gateway的ID。例如:

resource "azurerm_vpn_connection" "vpn_connection" {
  vnet_gateway_id = "your_vnet_gateway_id"
  # 其他配置
}

在上面的示例中,我们在”infrastructure”文件夹中的Terraform配置文件中添加了一个输出来共享VNET Gateway的ID。然后,在”VPN”文件夹中的Terraform配置文件中,我们手动引用了VNET Gateway的ID。
请注意,您需要将示例中的”your_vnet_gateway_id”替换为实际的VNET Gateway的ID。

正文完