【问题标题】:Managing environment specific properties of infrastructure with Terraform [closed]使用 Terraform 管理基础设施的环境特定属性 [关闭]
【发布时间】:2020-05-17 23:13:48
【问题描述】:

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)的数据库服务器

并在单个 main.tf 中使用 Terraform 进行配置。 terraform apply 具有魔力,将所有资源部署到我的 (Azure) 帐户,并使 Web 服务器可通过 example.com 访问。

我知道如何重构我的基础架构代码,以引入应用上述最佳实践的开发、阶段和生产环境。

我不知道如何处理特定于环境的变量,尤其是对于网络而言。也就是说,对于每个 dev、stage 和 prod 环境:

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

大概是通过某种形式的参数化处理的。

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

【问题讨论】:

  • 就目前而言,这个问题相当广泛,没有一个具体的答案。根据个人喜好,不同用户的答案可能会有所不同。此外,你还有很多小问题很难给出所有答案。我会尝试将问题的范围缩小到要解决的特定问题或错误。
  • 背景可能确实很广泛,因为我想全面了解我在 Terraform 中的位置,但问题非常具体:如何管理特定于环境的属性,如机密或域名。这都是从多个角度提出的单一问题。
  • 我不同意关闭这个。也许 Azure MVP 应该学习如何在理解和了解 Terraform 的情况下阅读,以免他们盲目地判断问题没有集中。它清楚地询问如何管理特定于环境的属性,并且在详细问题(秘密、DNS、SSL)中提出的所有问题在这种情况下都是特定于环境的,因此以相同的方式进行管理。我什至会提示那些想回答的人。
  • 我其实想过回答这个问题。但是最后你有 4 个不同的问题。在 Terraform 的上下文中,我可以回答 1 甚至 2。但是 3 和 4 我不能,因为它开始改变范围。如果您可以编辑问题以更好地解决每个工作区切换变量的问题,我很乐意提供一种处理此问题的方法。但我的回答是特定于 Terraform 和工作区的,对那些使用 Terragrunt 的人无效,并且超出了 Azure DevOps 的范围。因此,为什么我建议缩小范围。我正在尝试概述我最初关闭的理由。
  • @AndyShinn 我到底怎么知道问题 1 和 2 的解决方案与问题 3 和 4 的解决方案不同?如果我知道,我可能不需要问。我猜想使用variables.tf 文件可以有效地管理特定于环境的机密和DNS 名称。应用此类知识的传递属性并假设 SSL 证书和其他证书可以类似地管理(通过变量等到证书文件的不同路径)是有效的。如果这不正确,答案可以说明这一点,澄清 OP 的误解,指出需要不同的解决方案。关闭只是强制执行鸡蛋问题。

标签: azure azure-devops terraform devops environment


【解决方案1】:

在我的项目中,我将所有局部变量存储到一个文件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] 请注意,局部变量的每个对象的键应反映您的 terraform 环境的名称。

【讨论】:

  • 对于所有可以基于文件声明的东西来说,它看起来都是可行的解决方案。
猜你喜欢
  • 2019-06-08
  • 2021-11-12
  • 2022-10-20
  • 2022-10-19
  • 2021-12-25
  • 2018-07-28
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
相关资源
最近更新 更多