【问题标题】:How to create a resource group that can be shared between modules in terraform?如何创建一个可以在 terraform 中的模块之间共享的资源组?
【发布时间】:2021-07-02 08:33:38
【问题描述】:

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

【问题讨论】:

    标签: terraform terraform-provider-azure


    【解决方案1】:

    一般来说,不建议像您组织代码那样使用具有单一资源的模块。但是,在这种情况下,您需要提供导出的资源属性作为该模块的输出。在您的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
    

    【讨论】:

      【解决方案2】:

      有两种不同类型的共享需要不同的解决方案。您需要确定要查找的共享类型,因为您的示例不是很能说明问题。

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多