使用经过实战测试的版本模块的多客户端多租户多环境的 Terraform 布局

问题描述

我正在尝试为绿地 Azure 项目编写 terraform 代码,以下是要求:

  • 该项目是多客户的 - 客户 A、客户 B、客户 C ... 未来的客户
  • 每个客户将有多个环境 Prod(Tenant1)、Staging (Tenant2) 和 Non-Prod(Dev、QA、UAT、Pre-staging)(Tenant3)
  • 使用内部托管在 Gitlab 中的版本化模块的 DRY 代码
  • TFState 文件必须存储在 Azure 存储帐户中 - 安全、加密且具有锁定机制。
  • 必须使用 GitLab CI/CD 完成部署

我需要一些最佳实践建议和示例以及以下问题的答案:

  1. 模块(子模块)存储库的文件夹布局是什么?带有示例版本模块和变量定义?
  2. 假设我想将每个客户端与其他客户端以及每个环境与其他环境隔离,项目(根模块)的布局是什么?
  3. 我们是否使用 .tfvars 或 terraform Workspaces 来实现 DRY 代码?或 Terragrunt 假设我们使用的是 terraform >0.12?。如果我们使用.tfvars,我们如何隐藏敏感信息(terraform 0.14 hassensitive: true]
  4. Gitlab CI/CD 管道的设计是什么?我可以将管道阶段想象为: dev-tf-plan --> dev-tf-apply --> qa-tf-plan --> qa-tf-apply --> uat-tf-plan --> uat-tf-apply ..... .. prod-tf-plan --> prod-tf-apply 这是我们一个单一的分支(主)可以在所有环境中进行 我们如何将其扩展到多客户?
  5. 是将所有模块保存在单个 git 存储库中还是将每个子模块保存在自己的 git 存储库中?

分享您在处理类似场景方面的想法和经验。

谢谢

解决方法

是的,您需要 terragrunt,terraform 包装器,它涵盖了您的所有想法,无需过多关注。

浏览此示例并从它开始:

https://github.com/gruntwork-io/terragrunt-infrastructure-live-example

为您的环境添加文件夹结构,

client1
  | _global
  |-dev
    |-us-east-1
  |-prod
    |-us-east-2
clilent2
  | _global
  |-dev
  |prod

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...