如何创建可以在 terraform 中的模块之间共享的资源组?

时间:2021-06-30 23:42:24

标签: terraform terraform-provider-azure

在 terraform for azure 中创建可以跨不同模块共享的资源组的正确方法是什么?一段时间以来,我一直在努力解决这个问题,但它不起作用。正如你在这张图片中看到的。我在一个单独的文件夹中有一个资源组。在我的 main.tf 文件中,我加载了模块 appservice 和 cosmosdb。我似乎无法弄清楚如何使 appservice 和 cosmosdb tf 文件引用位于此位置的资源组。这是怎么做的?任何建议将不胜感激。谢谢。

enter image description here

2 个答案:

答案 0 :(得分:0)

一般来说,不建议像组织代码那样使用单一资源的模块。但是,在这种情况下,您需要提供导出的资源属性作为该模块的输出。在您的 resource_group 模块中:

output "my_env_rg" {
  value       = azurerm_resource_group.rg
  description = "The my-env-rg Azure resource group."
}

然后,包含资源的导出资源属性映射的输出可以在您声明模块的配置模块中访问。例如,在您的根模块配置中(大概包含您在问题中引用的 main.tf):

module "azure_resource_group" {
  source = "resource-group"
}

将使输出可通过命名空间 module.<MODULE NAME>.<OUTPUT NAME> 访问。在这种情况下,这将是:

module.azure_resource_group.my_env_rg

答案 1 :(得分:0)

有两种不同的共享需要不同的解决方案。您需要决定要寻找哪种分享方式,因为您的示例不是很具有说明性。

第一个是您想要创建一种模式来创建您想要使用两次的东西。目标是创建许多不同的东西,每个东西都有不同的参数。规范示例是 RDS 实例或 EC2 实例。将 Terraform 模块视为一个函数,您可以在不同的地方使用不同的输入执行它,并独立使用不同的结果。这正是 Terraform 模块的用途。

第二个是你想要制作一个东西并在多个地方引用它的地方。规范示例是 VPC。您不想为每个自动缩放组创建一个新的 VPC - 您想重用它。

Terraform 没有将一组资源的输出作为输入拼接到另一组资源的好方法。 Atlas 和 Cloudformation 也一样。如果您不使用它们,则必须自己将它们缝合在一起。我一直在围绕 Terraform 编写一个包装器,它使我能够做到这一点(以及其他事情,如验证和身份验证)。将输出保存到已知位置,然后稍后将其作为输入引用。

相关问题