首页 > 解决方案 > 如何使用 Terraform 将资源创建拆分为不同的模块?

问题描述

我想使用不同的模块分割资源创建,但我一直无法弄清楚如何。

对于此示例,我想创建一个 Web 应用程序(我使用的是 azurerm 提供程序)。我通过将以下内容添加到模块来做到这一点:

resource "azurerm_app_service" "test" {
  name                = "${var.app_service_name}"
  location            = "${var.location}"
  resource_group_name = "${var.resource_group_name}"
  app_service_plan_id = "${var.app_service_plan_id}"

  app_settings {
    SOME_SETTING = "${var.app_setting}"
  }
}

它可以工作,但我想有一个单独的模块来应用应用程序设置,所以:

这可能吗?我尝试将其拆分(有两个模块定义 Web 应用程序,但其中只有一个包含应用程序设置),但我收到一条错误消息,指出 Web 应用程序已经存在,所以它似乎不明白我试图操纵相同的资源。

有关如何使用它的详细信息: 我将为最终用户提供一个 UI,他/她可以在该 UI 上选择所需的一堆资源并勾选该人项目所需的一系列选项,以及填写所需的参数为基础设施。

完成并提交后,参数将应用于 Terraform 模板。为每个选项排列设置一个模板是不可行的,因此必须根据所选选项包含不同的模块。

例如:如果用户勾选 Web 应用程序、Cosmos DB 和应用程序洞察,Terraform 模板将包含这些模块(使用计数技巧创建条件)。在此示例中,我需要将检测密钥从应用程序洞察传递到 Web 应用程序的应用程序设置,这就是我的问题所在。

如果用户没有选择应用程序洞察力,我不想要 Web 应用程序的设置,这就是我需要逐步构建 Terraform 资源的原因。此外,根据用户选择的数据库类型,不同的设置将添加到 Web 应用程序的设置中。

所以我的想法是创建一个模块来应用某些应用程序设置。我不知道这是否可能(或存在更好的方法),因此我的问题。

标签: terraformterraform-provider-azure

解决方案


执行此操作的最佳方法是使用 bash 脚本或您想要的任何脚本语言 (python) 包装 terraform。然后在 bash 或 python (jinja2) 中创建一个模板,以使用客户为设置选择的任何选项生成资源,运行模板以生成您的 terraform 代码,然后应用它。

我已经用 S3 存储桶做了很多。在 terraform 0.12 中,您可以在 terraform 中生成模板。


推荐阅读