问题描述
我正在尝试为绿地 Azure 项目编写 terraform 代码,以下是要求:
- 该项目是多客户的 - 客户 A、客户 B、客户 C ... 未来的客户
- 每个客户将有多个环境 Prod(Tenant1)、Staging (Tenant2) 和 Non-Prod(Dev、QA、UAT、Pre-staging)(Tenant3)
- 使用内部托管在 Gitlab 中的版本化模块的 DRY 代码
- TFState 文件必须存储在 Azure 存储帐户中 - 安全、加密且具有锁定机制。
- 必须使用 GitLab CI/CD 完成部署
我需要一些最佳实践建议和示例以及以下问题的答案:
- 模块(子模块)存储库的文件夹布局是什么?带有示例版本模块和变量定义?
- 假设我想将每个客户端与其他客户端以及每个环境与其他环境隔离,项目(根模块)的布局是什么?
- 我们是否使用 .tfvars 或 terraform Workspaces 来实现 DRY 代码?或 Terragrunt 假设我们使用的是 terraform >0.12?。如果我们使用.tfvars,我们如何隐藏敏感信息(terraform 0.14 hassensitive: true]
- 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 这是我们一个单一的分支(主)可以在所有环境中进行 我们如何将其扩展到多客户?
- 是将所有模块保存在单个 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