terraform - 如何使用 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}"
}
}
它可以工作,但我想有一个单独的模块来应用应用程序设置,所以:
- 模块 1 创建 Web 应用程序
- 模块 2 应用应用程序设置
- 潜在模块 3 将其他内容应用于 Web 应用程序
这可能吗?我尝试将其拆分(有两个模块定义 Web 应用程序,但其中只有一个包含应用程序设置),但我收到一条错误消息,指出 Web 应用程序已经存在,所以它似乎不明白我试图操纵相同的资源。
有关如何使用它的详细信息: 我将为最终用户提供一个 UI,他/她可以在该 UI 上选择所需的一堆资源并勾选该人项目所需的一系列选项,以及填写所需的参数为基础设施。
完成并提交后,参数将应用于 Terraform 模板。为每个选项排列设置一个模板是不可行的,因此必须根据所选选项包含不同的模块。
例如:如果用户勾选 Web 应用程序、Cosmos DB 和应用程序洞察,Terraform 模板将包含这些模块(使用计数技巧创建条件)。在此示例中,我需要将检测密钥从应用程序洞察传递到 Web 应用程序的应用程序设置,这就是我的问题所在。
如果用户没有选择应用程序洞察力,我不想要 Web 应用程序的设置,这就是我需要逐步构建 Terraform 资源的原因。此外,根据用户选择的数据库类型,不同的设置将添加到 Web 应用程序的设置中。
所以我的想法是创建一个模块来应用某些应用程序设置。我不知道这是否可能(或存在更好的方法),因此我的问题。
解决方案
执行此操作的最佳方法是使用 bash 脚本或您想要的任何脚本语言 (python) 包装 terraform。然后在 bash 或 python (jinja2) 中创建一个模板,以使用客户为设置选择的任何选项生成资源,运行模板以生成您的 terraform 代码,然后应用它。
我已经用 S3 存储桶做了很多。在 terraform 0.12 中,您可以在 terraform 中生成模板。
推荐阅读
- python - 带有 Flask 的 iOS 应用程序
- javascript - 未在数据对象内部定义时,VueJS 变量值不会更新
- javascript - Nock Headers 授权被禁止
- java - 如何处理需要网络资源的类?
- php - PHP时间戳保存在mysql 0000-00-00 00:00:00
- javascript - 如何获取动态生成的输入字段的输入值
- xcode - 无法构建 iOS 应用程序(Xcode 版本 9.4.1 (9F2000),Flutter 0.5.1)
- javascript - 格式化表格中的序列化数据并选择数据
- c# - 我认为 Unity 3D RotateTowards 不起作用需要一个阈值
- reactjs - Redux 返回一个由我们现有状态组成的新对象