首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform -一个集中状态或多个模块状态

Terraform -一个集中状态或多个模块状态
EN

Stack Overflow用户
提问于 2017-09-20 19:11:53
回答 2查看 1.1K关注 0票数 6

我已经为我们在AWS中构建虚拟数据中心所需的所有资源创建了一个terraform堆栈。VPC、子网、安全组等。

这一切都很好:)。我经常与网络工程师争论,他们想要有一个完全独立的网络状态等等。因此,我们必须管理多个状态文件,它需要10到15个terraform计划/应用命令才能到达数据中心。不仅仅是我们必须多次运行这些命令,我们不能在创建ec2实例等时引用模块输出变量,所以现在变量文件中出现了“神奇”变量。我希望将创建ec2实例、els等的脚本放在与“数据中心”配置相同的目录中,这样我们就可以管理一个状态文件(使用dynamodb锁在s3中加密),并且我们的git与我们的基础设施有一对一的关系。另外,单一的terraform计划/应用程序将在一个命令中构建整个数据中心,这也带来了额外的好处。

问题是,在单个状态文件中管理数据中心资源(vpc、子网、安全组)和计算资源是个好主意吗?有什么问题我可能会遇到吗?有人有用这种方式管理AWS环境的经验吗?

你好,大卫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-20 20:32:34

首先,让我们访问其他状态文件中的输出变量,这样您就不必使用神奇的变量了。剩下的只是你的风格问题。你经常把整个数据中心的基础设施都拿上来吗?如果是这样的话,你可以考虑在一个项目中进行。另一方面,如果您只改变了一些东西,您可能想要使它更加模块化,依赖于其他项目的输出。保持它们的分离使得规划更快,并且避免了代价非常高的terraform destroy错误。

票数 6
EN

Stack Overflow用户

发布于 2022-02-02 18:49:24

在过去的几年里,有很多关于Terraform项目布局的讨论。

随着Terraform1.0的出现,时代也发生了变化,所以我认为这个问题值得我们去关注。

因此,我们必须管理多个状态文件,它需要10到15个terraform计划/应用命令才能到达数据中心。

使用模块可以维护分离状态,而不需要对每个状态执行命令。

不仅仅是我们必须多次运行命令,我们不能引用模块输出变量。

Terraform支持输出值。利用Terraform或Terraform远程状态可以在状态之间引入依赖关系。

在我看来,进入多个Terraform状态的先决条件是使用状态锁定 (OP指的是使用AWS DynamoDB锁机制,但其他存储后端也支持这种机制)。

通常,在单一状态下拥有所有东西并不是最好的解决方案,可能会被认为是反模式。

具有多个状态称为状态隔离

你为什么要孤立国家?

原因是多方面的,好处是明确的:

  • bug爆炸半径。如果您在代码中的某个地方引入了一个bug,那么您将应用all,在最坏的情况下,整个数据中心的代码都会受到影响。另一方面,如果在最坏的情况下网络是分开的,那么bug只会影响网络(在DC中这将是一个非常严重的问题,但仍然比一切都好)。
  • 状态(写)锁。如果您使用状态锁,Terraform将锁定可能写入状态的任何操作的状态。这意味着在单个状态下,多个工作在不同区域的团队无法同时写入状态,因此,例如更新网络块实例设置。
  • secrets.秘密是以纯文本形式写给国家的。单一状态意味着所有团队的机密都将处于同一状态(您的必须进行加密,OP正在正确地执行此操作)。和任何有安全保障的东西一样,把所有的鸡蛋都放在同一个篮子里是有风险的。

隔离状态的另一个好处是文件布局可能有助于代码所有权(跨团队或项目)。

如何隔离状态?

主要有三种方式:

  1. 通过文件布局(有或没有模块)
  2. 通过工作区(不要与Terraform工作区混淆)
  3. 混合上述方法(龙来了!)

关于如何做到这一点,没有达成广泛的共识,只能作进一步的阅读:

一个值得一看的工具可能是Terragrunt来自Gruntwork。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46330036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档