这是一组有关Terraform工作原理的概念性文章。
1)这是一个场景。可以说我创建了一个简单的计划,该计划在AWS中创建了几台机器。初始化,应用,构建基础结构并创建本地状态文件。对代码满意后,我将其推送至github。我的问题是我还应该推送状态文件吗?没有状态文件,任何拉下代码并再次尝试构建实例的人都不会拥有状态,因此我假设terraform尝试构建新的计算机集。但是,状态文件感觉像是残留数据,因此应该忽略。
2)同样的情况,但是可以说该计划包括一个实现S3后端的安装文件。是否存在相同的问题,或者该计划的执行是否符合S3后端的状态?
3)现在,让我们说我希望该计划在更大的计划中作为模块运行,该计划可以部署整个环境并将其状态文件存储在S3中。该模块已经运行,因此已经存在机器。因为该模块使用总体计划的状态文件,还是使用现有的s3状态文件,所以将模块作为较大模块的一部分运行的方式与(1)相同吗?
4)后端设置是否应作为独立模块实施?我的想法是,如果有人尝试运行Terraform销毁,他们就不会销毁后端,而只会销毁基础设施。
总的来说,我对Terraform的企业工作流程感到困惑。
答案 0 :(得分:2)
我将根据我在Terraform方面的经验来回答:
1)使用Terraform进行任何操作都需要更新的Terraform状态。 It is a requirement of the technology。您可以通过文件共享或git共享此状态(不建议这样做,如果有人忘记进行git pull,就会遇到问题,并且该状态包括应保护的敏感数据)。如果使用standard backends,最好使用一个。如您所说,如果在没有更新状态的情况下执行terraform,它将重新创建整个基础结构。
2)有效地,使用S3(或任何其他)后端解决了该问题。有了后端,Terraform会在执行任何操作之前负责拉动远程状态。
3)不,如果您更改计划,则必须手动更新状态。您可以使用terraform refresh
或terraform import
将现有基础架构导入该州。
4)每个terraform计划都必须有一个后端,无法在模块中配置后端。模块是要导出和共享的,因此必须与后端无关。后端不受terraform的管理(您应该在开始使用terraform之前创建它),因此无论如何都不会销毁它。如果要防止其他任何资源被破坏,则可以使用功能prevent_destroy。
Terraform有一些团队应该熟悉的注意事项,其中之一是,更改计划的结构意味着需要进行额外的工作以使现有基础结构与国家保持一致。
无论如何,使用远程后端,团队可以毫无困难地在同一计划中一起工作。