gpt4 book ai didi

azure - 无法评估使用资源组数据源的 Terraform 模块

转载 作者:行者123 更新时间:2023-12-03 07:04:17 24 4
gpt4 key购买 nike

我已经编写了一大堆模块,它们使用数据源来确定 azure 位置,以便计算它而不是必须提供它。像这样的东西:

function_app父模块

data "azurerm_resource_group" "rg" {
name = var.resource_group_name
}

resource "azurerm_function_app" "function_app" {
location = data.azurerm_resource_group.rg.location
resource_group_name = data.azurerm_resource_group.rg.name
....

资源组父模块

resource "azurerm_resource_group" "rg" {
name = var.name
location = var.location
tags = var.tags
}

output "name" {
description = "The Resource Group name."
value = azurerm_resource_group.rg.name
}

output "id" {
description = "The Resource Group id."
value = azurerm_resource_group.rg.id
}

output "location" {
description = "The Resource Group location."
value = azurerm_resource_group.rg.location
}

在使用模块时,我现在遇到一个问题,即找不到资源组,因为 terraform 在应用之前会评估数据源:

函数应用子模块

module "rg" {
source = "../"
name = <name>
location = "Australia East"
tags = var.tags
}


module "function_app" {
source = "../"
functionapp_name = "Func-Testing"
app_service_plan_name = "testappserviceplan"
resource_group_name = module.rg.name
os_type = "linux"
...
│ Error: Error: Resource Group "<name>" was not found

│ with module.function_app.data.azurerm_resource_group.rg,
│ on .terraform\modules\function_app\terraform\azurerm_function_app\data.tf line 1, in data "azurerm_resource_group" "rg":
│ 1: data "azurerm_resource_group" "rg" {

我通常会使用 depends_on = [module.rg] 解决问题,但您可能知道这会创建显式依赖项,现在我遇到了下一个计划想要重新创建的问题一些资源。显然,使用“depends_on”会产生副作用,即无法计算资源,因此必须重新创建资源才能获取值。我在下一个计划中看到了这样的“部队替换”:

  # module.vnet.azurerm_virtual_network.vnet must be replaced
-/+ resource "azurerm_virtual_network" "vnet" {
- flow_timeout_in_minutes = 0 -> null
~ guid = "<id>" -> (known after apply)
~ id = "/subscriptions/<sub-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/virtualNetworks/<vnet>" -> (known after apply)
~ location = "australiaeast" -> (known after apply) # forces replacement
....

因此,在模块中为资源组提供数据源可能不是一个好主意。有人知道我可以使用的子模块中解决这个问题的方法吗?不使用“depends_on”?而且我不必重新编写很多模块:D。

最佳答案

问题的解决方案是从模块正确输出位置或资源组。这意味着您必须向模块添加输出,例如

output "rg" {
value = azurerm_resource_group.rg
}

然后在父模块中将其引用为:


module "test" {
source = "./mymodule"
}

resource "azurerm_function_app" "function_app" {
location = module.test.rg.location
resource_group_name = module.test.rg.name

或者,您必须开始使用depends_on,正如您指出的那样,这对于您的情况来说不是一个好的做法。

关于azure - 无法评估使用资源组数据源的 Terraform 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71669453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com