资源级别的Terraform锁定状态?

时间:2017-12-21 19:48:58

标签: terraform

我有一个包含多个资源/模块的tf文件,它在s3中都使用了一个远程状态文件。

我经常在tf文件中定位特定的模块。

如果我有锁定设置,这意味着两个人即使针对不同的模块也无法同时进行更改?

从我读到的内容来看,Terraform似乎锁定了整个状态文件。它是否支持资源级别锁定?在这方面,Doc似乎并不清楚。

1 个答案:

答案 0 :(得分:1)

你是对的,Terraform会锁定整个州档案,无论你用什么资源进行定位。

这种实现背后的想法是资源之间可能存在引用。更确切地说,涉及一个资源(创建/更新/销毁)的事件最初可能导致创建/更新/销毁其他资源。因此,即使apply -target=resource_one.ref_name也可能导致其他资源发生变化。所有这些都应该在terraform plan中呈现。

所有状态操作(包括锁定)都在currently(S3,Consul,TFE,...)级别上实现backend,并且它们之间的通用接口不灵活因为公分母基本上是JSON(状态文件)的blob。

如果您有两个或更多独立的基础架构部分,那么我建议您将它们拆分为不同的workspaces或目录。分割配置文件后,您可以利用terraform state subcommands进行迁移。

您还可以使用terraform_remote_state data source来引用从这些部分中公开的任何输出。

在单个状态文件中管理基础架构的独立部分并不是我推荐的原因有几个:

  • 它不能很好地扩展。当您开始添加更多资源时,需要花费时间来完成terraform plan&当Terraform必须检查每个资源的当前状态时,apply会增加。
  • 所有关键的Terraform命令都具有比所需更宽的爆破半径,这使得人为错误更加可怕。例如意外terraform destroy将摧毁一切,而不仅仅是你的基础设施的一部分。

-target标志用于特殊情况,用于例行操作,mentioned in the docs