对于是否将.tfstate文件提交到Git中,我有点困惑。Terraform文档指出:
默认情况下,Terraform还将一些状态放入
terraform.tfstate文件中。这个状态文件非常重要;它将各种资源元数据映射到实际的资源ID,以便Terraform知道它正在管理什么。此文件必须保存并分发给任何可能运行Terraform的人。我们建议简单地将它放到版本控制中,因为它通常不太大。
另一方面,在使用Terraform时的最佳实践上被接受和反对的答案是:
Terraform配置可以用于在不同的基础结构上提供许多框,每个框都可能有不同的状态。由于它也可以由多个人运行,所以这个状态应该位于一个集中的位置(比如S3),而不是git。
(重点是原作者,而不是我)
谁是对的,如果是,为什么?
发布于 2017-01-05 10:18:59
TL;DR:
重要!存储在源代码管理中的可能会暴露https://www.terraform.io/docs/state/sensitive-data.html,并有可能针对旧版本的状态运行Terraform。不要这样做。
Terraform不再建议将状态存储在源代码管理中。您的“好”选项是远程的或本地的。
相对于本地和存储在源代码管理中,远程状态提供了显著的好处。详情如下。
原始答案:
叶夫根尼的回答很好。由于Terraform已经更新了他们的文档,所以这个问题现在已经不那么有争议了:
默认情况下,Terraform还将一些状态放入terraform.tfstate文件中。这个状态文件非常重要;它将各种资源元数据映射到实际的资源ID,以便Terraform知道它正在管理什么。此文件必须保存并分发给任何可能运行Terraform的人。通常建议在使用Terraform时设置远程状态。--这意味着存储在状态文件中的任何潜在秘密,都不会被签入版本控制。
因此,既定最佳做法与官方建议之间不再存在分歧。
更新2019-05-17
在最新版本的文档中,这已更改为:
..。默认情况下,此状态存储在名为"terraform.tfstate“的本地文件中,但也可以远程存储,这在团队环境中工作得更好。..。
我不认为这个建议会恢复到源代码管理是存储状态的首选方法。
尽管上述引用了文档,远程状态作为一个单独的开发人员仍然是有益的。
远程状态允许solo开发人员:
发布于 2016-08-03 16:23:24
不将.tfstate文件存储在Git中有几个原因:
terraform apply之后提交和推送您的更改,因此您的队友将拥有过时的.tfstate文件。另外,如果两个团队成员在相同的.tfstate文件上同时运行Terraform,而不对这些状态文件进行任何锁定,您可能会覆盖对方的更改。您可以通过以下两种方法来解决这两个问题: a)使用.tfstate将S3文件存储在S3桶中,这将在每次运行terraform apply时自动推拉.tfstate文件;b)使用土方之类的工具为.tfstate文件提供锁定。.tfstate文件可能包含秘密。例如,如果使用实例资源,则必须指定数据库密码,Terraform将以明文形式将其存储在.tfstate文件中。对于Terraform来说,这是一种糟糕的做法,首先,在版本控制中存储未加密的秘密只会使情况变得更糟。至少,如果将.tfstate文件存储在S3中,则可以在rest启用加密(SSL在运行时提供加密),并配置IAM策略以限制谁拥有访问权限。这是非常不理想的,我们将不得不看看关于它的讨论这个问题的公开问题是否曾经被修正过。要获得更多信息,请查看如何管理地形状态和http://www.terraformupandrunning.com/,这两篇文章都是我写的。
发布于 2016-07-21 06:59:08
这可能会归结为首选,但我要说,git (或任何其他源代码管理)对于存储状态文件来说并不是一个特别好的选择,因为它们是您正在编写的代码的输出,非常像编译好的二进制文件,甚至是最小化的JS或更少编译到CSS的JS。
最重要的是,状态文件中的事情可能会发生相当快的变化,将其作为正在运行的事物的输出,而不是代码中实际更改的东西,这会使整个事情变得非常尴尬。
但是,如果您是在不同的笔记本/机器上开发的话,您确实需要一些方法来与任何远程团队成员共享这些状态文件,甚至与其他设备共享这些状态文件。您还需要某种方式来存储和备份这些文件,因为如果您丢失了一个状态文件,那么您将有一些真正的痛苦,因为Terraform使用状态文件来确定它正在管理的东西,以避免踩到其他工具的脚尖。
我想说,S3可能是你现在能把它们放在最好的地方。它几乎是免费的,耐久性和可用性都很好,使用远程状态资源在Terraform中对它有很好的本地支持。最重要的是,您只需创建一个S3桶即可开始工作。必须首先在没有Terraform的情况下构建一个领事或蚀刻集群(否则,您会遇到一个鸡和蛋问题,您将在何处存储用于创建这些集群的状态?)即使你打算使用这两种产品中的任何一种,你也会感到有点痛苦。
显然,如果您使用的是OpenStack,那么斯威夫特应该是一个很好的替代方案(尽管我还没有使用它)。我也没有使用过Hashicorp的地图集,但是如果您愿意为该服务付费,它可能也同样有用。
https://stackoverflow.com/questions/38486335
复制相似问题