将两个现有Terraform状态组合为模块



现在我有一个Terraform项目,由多个目录组成:

root
|- stack
|- applications
|- app1
|- app2
|- app3
  • Stack包含应用程序的所有常见依赖项
  • app1app2app3使用远程状态来引用stack资源
  • 我目前必须在四个目录中的每一个目录中分别运行terraform apply和单独的.tfvars。(这是最初的设计。(

我想用根目录中的单个.tf文件和作为模块的stack/app*目录来重构这个项目。从TF的角度来看,我知道如何做到这一点很好,但由于这个项目已经部署在两个不同的环境中,我正在努力找出将我现有的stack/app*资源迁移到一个新的组合状态文件中的最佳方法,或者至少自动化我将需要运行的所有terraform import命令。

有什么想法吗?

Vincent是对的,Terraform state mv不会这么做。当时的想法是将两个州合并在一起。

我的第一个建议是,将整个项目组合成一个单独的main.tf、variable.tf……或者通过在一个main.tf 中一个接一个地调用它们来将它们作为一个模块

然后terraform init,它会带来类似于:

正在初始化模块。。。

正在初始化后端。。。后端配置已更改!

Terraform检测到为后端指定的配置已经改变。Terraform现在将检查后端中的现有状态。

是否要将现有状态复制到新后端?在迁移先前的"现有"状态时发现了预先存在的状态;gcs";的后端新配置的";gcs";后端。中已存在现有的非空状态新的后端。这两种状态已保存到临时文件中响应此查询后删除。

以前(类型"stateA"(:C:\Users\xx\xx\Temp\terraform447677407\xx.tfstate新建(类型"stateB"(:C:\Users\xx\xx\Temp\terraform447677407\yy.tfstate

是否要用以前的状态覆盖新后端中的状态?输入";是";复制和";否";从new中的现有状态开始配置";stateB";后端。

输入一个值:因此,您可以决定是合并这些状态还是使用新状态。我建议在执行此操作之前备份您的状态。

更多信息可在此处查看:https://www.terraform.io/docs/cli/commands/state/mv.html#example-移动模块到其他状态

哇,已经很久了。

我最终写了一个剧本;收获;使用terraform state show的旧状态中的资源ID,然后使用terraform import的另一个脚本将它们转换为新项目的状态。它不是特别令人愉快,但最终它做到了我需要它做的事情。那也是Terraform v0.11.x的东西。从那时起,国家变得更容易管理了。

您可能希望使用terraform state mv将状态从每个app状态移动到stack状态。确切的用法将取决于您所在州使用的后端类型。您可以从这里的文档中看到一个例子。在执行此操作之前,请确保备份所有状态文件,以便在出现问题时轻松恢复。

最新更新