【问题标题】:Terraform Best Practice Multi-Environment, Modules, and StateTerraform 最佳实践多环境、模块和状态
【发布时间】:2021-01-16 02:57:01
【问题描述】:

环境隔离:Dirs v. Workspaces v. Modules

Terraform 文档Separate Development and Production Environments 似乎采用两种主要方法来处理“开发/测试/阶段”类型的 CI 环境,即

  1. 目录分离 - 看起来很混乱,尤其是当您可能有多个存储库时
  2. 工作区 + 不同的 Var 文件

除了当您查找 workspaces 时,它似乎暗示工作空间不是隔离环境的正确解决方案。

特别是,组织通常希望在服务于不同开发阶段(例如暂存与生产)或不同内部团队的同一基础架构的多个部署之间建立强有力的分离。在这种情况下,用于每个部署的后端通常属于该部署,具有不同的凭据和访问控制。命名工作空间不适合这种情况。

相反,使用一个或多个可重用模块来表示公共元素,然后将每个实例表示为一个单独的配置,该配置在不同后端的上下文中实例化这些公共元素。在这种情况下,每个配置的根模块将仅包含一个后端配置和少量模块块,其参数描述了部署之间的任何微小差异。

我也想考虑使用远程状态——例如azurerm backend

最佳实践问题

  1. 当文档提到使用“可重用”模块时,如果说我没有现有的配置文件夹会是什么样子?我还需要为 dev/test/stage 创建一个单独的文件夹吗?
  2. 使用远程后端时,状态文件是默认跨 repos 共享还是由 repo 和 enviornment 分隔?

例如

terraform {
  backend "azurerm" {
    storage_account_name = "tfstorageaccount"
    container_name       = "tfstate"
    key                  = "${var.enviornment}.terraform.tfstate"
  }
}

对比

terraform {
  backend "azurerm" {
    storage_account_name = "tfstorageaccount"
    container_name       = "tfstate"
    key                  = "cache_cluster_${var.enviornment}.terraform.tfstate"
  }
}

【问题讨论】:

  • 这个问题可能会因为过于宽泛和基于观点而被关闭,所以我建议重做这个问题。至于 learn Hashicorp 网站,值得注意的是其中的练习是出于教学目的,不应被视为最佳实践的指示。

标签: terraform


【解决方案1】:
  1. 当文档提到使用“可重用”模块时,如果说我没有现有的配置文件夹会是什么样子?我还需要为 dev/test/stage 创建一个单独的文件夹吗?

基础架构的可重用模块本质上封装了所有“开发/测试/阶段”环境共有的基础架构部分。所以不,你不会有任何“dev/test/stage”文件夹。

例如,如果您有一个由 Kubernetes 集群和 MySQL 数据库组成的基础架构,则可以有两个模块 - 一个处理 k8s 集群的“计算”模块和一个处理D B。这些模块进入/modules 子文件夹。然后,您的根模块(位于您的 repo 根目录中的main.tf 文件)将实例化这些模块并传递适当的输入变量以针对每个“dev/test/stage”环境自定义它们。

通常会更复杂一点:

  • 任何共享 VPC 或防火墙配置都可能进入 networking 模块。
  • 您可能自动创建的任何服务帐户都可能进入credentialsiam 模块。
  • API 端点的任何 DNS 映射都可能进入 dns 模块。

然后,您可以轻松地传入变量以根据需要自定义“dev/test/stage”的行为。


  1. 使用远程后端时,状态文件是默认跨 repos 共享还是由 repo 和 enviornment 分隔?

退出 Terraform 文档及其建议的分离:

在这种情况下,用于每个部署的后端通常属于该部署,具有不同的凭据和访问控制。

你不会分享tfstorageaccount。现在对此持保留态度并确定您自己的需求 - 基本上您需要考虑的是共享后端/凭证的安全性和数据完整性影响。例如:

  • 您所在的州有多敏感?如果您将敏感变量输出到您的状态,那么您可能不希望您的“生产”状态与您的“测试”状态处于相同的安全边界。

  • 您是否需要清除状态或执行破坏性操作?例如,如果您的状态存储提供程序仅按文件夹进行版本,那么您可能不希望您的“开发/测试/阶段”状态彼此相邻。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多