使用Terraform管理基础架构的环境特定属性

时间:2020-02-01 15:13:16

标签: azure azure-devops terraform devops environment

Originally posted DevOps,但该空间似乎不那么活跃。

TL; TR:假设存在用Terraform编码的Web服务器基础结构的开发,阶段和生产环境。如何确保每个环境在具有不同SSL证书(在Azure上)的不同域上运行?


基本上,我已经学到这些ways to manage Terraform states

  1. 通过Terraform workspaces隔离
  2. 通过文件布局隔离

,对于每个环境(开发,阶段,产品),在AWS,Azure等上都有一个专用帐户。

我还了解了专用于本地manual testing the infrastructure code的沙箱环境的重要性。我还读了一些关于role of reusable Terraform modules以及Terragrunt for working with multiple Terraform modules, and managing remote state之类的助手的信息。

我想我已经很好地理解了所有这些难题如何在代码级别上更适合使用基础架构。

我所缺少的是如何在开发,测试和生产工作流以及使用不同环境的背景下设计基础结构的详细方面。

例如,让我们考虑一个简单的基础架构,该基础架构包括:

  1. 单个虚拟网络(具有必要的子网等)
  2. 具有(公共IP)的Web服务器
  3. 具有(可从Web服务器访问的专用IP)数据库服务器

,并使用Terraform在单个main.tf中进行配置。 terraform apply发挥了神奇的作用,将所有资源部署到了我的(Azure)帐户,并使Web服务器可以从example.com访问。

我知道如何重构基础结构代码,以采用上述最佳实践来介绍开发,阶段和产品环境。

我不知道如何处理特定于环境的变量,尤其是对于网络而言。也就是说,对于每个开发,阶段和生产环境:

  1. 在哪里保存各种秘密,尤其是对于开发人员和舞台而言?
  2. 如何管理DNS / FQND设置?显然,所有环境不能共享相同的example.com
  3. 如何处理SSL证书?
  4. 如何处理带有开发人员或阶段特定数据的预加载数据库?

大概,这些都是用某种形式的参数化处理的。

  • 建议使用哪种Terraform技术?
  • 每个环境目录下的variables.tf.tfvars(或具有自定义帮助脚本或Makefile的等效环境变量)文件是不错的选择吗?

1 个答案:

答案 0 :(得分:2)

在我的项目中,我将所有局部变量存储到文件local-variables.tf中,该文件的结构类似于:

locals {
  database_ip = {
    staging = xxx.xxx.xxx.xxx
    production = xxx.xxx.xxx.xxx

  }
  ssl_cert = {
    staging = <staging_path>
    production = <production_path

  }
}

然后,您可以引用变量local.database_ip[terraform.workspace] 请注意,局部变量的每个对象的键应反映您的地形环境的名称。