【问题标题】:Combining two existing Terraform states as modules将两个现有的 Terraform 状态组合为模块
【发布时间】:2018-11-19 15:25:29
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

  • 我想知道手动破解各种状态文件是否是最好的方法。
  • 我正在考虑,但我认为从长远来看,从现有状态文件中获取所有资源的 ID 并将它们导入到新地址中可能会更好。

标签: terraform


【解决方案1】:

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

【讨论】:

  • 命令terraform state mv ... 不行。它仅用于重命名同一状态文件中的资源地址,而不是跨 2 个状态文件移动。我希望该命令更好地命名为terraform state rename-resource-address ...
【解决方案2】:

Vincent 是对的,Terraform state mv 不会这样做。想法是将两个状态合并在一起。

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

然后是terraform init,它会带来类似的东西:

正在初始化模块...

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

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

您想将现有状态复制到新的后端吗? 将先前的“gcs”后端迁移到 新配置的“gcs”后端。现有的非空状态已经存在于 新的后端。这两种状态已保存到临时文件中 响应此查询后删除。

上一个(键入“stateA”):C:\Users\xx\xx\xx\Temp\terraform447677407\xx.tfstate 新(类型“stateB”):C:\Users\xx\xx\xx\Temp\terraform447677407\yy.tfstate

您想用以前的状态覆盖新后端中的状态吗? 输入“yes”复制,输入“no”以新的现有状态开始 配置“stateB”后端。

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

更多信息可以在这里看到:https://www.terraform.io/docs/cli/commands/state/mv.html#example-move-a-module-to-another-state

【讨论】:

  • 我不认为terraform init 会成功。 terraform 消息Terraform has detected that the configuration specified for the backend has changed 仅处理状态文件从一个 S3 存储桶移动到另一个存储桶的情况。但是,在重新初始化之后,新的状态文件不会比旧的状态文件包含更多或新的资源。到目前为止,我能想到的唯一解决方案是归结为 terraform import 命令——要么手动编写该命令,要么像原始海报最终那样编写自己的 shell 脚本来生成这些命令。
【解决方案3】:

哇,好久不见了。

我最终编写了一个脚本,使用 terraform state show 从我的旧状态“收集”资源 ID,然后将另一个脚本 terraform import 它们放入我的新项目状态。这不是特别令人愉快,但最终它完成了我需要它做的事情。那也是 Terraform v0.11.x 的东西。从那时起,状态变得更容易管理。

【讨论】:

  • State has become a lot easier to manage since then. 怎么样?使用今天最新的 terraform 版本,您的答案/解决方案会有所不同吗?
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2022-06-11
  • 2018-03-17
  • 2018-03-01
  • 2020-10-07
相关资源
最近更新 更多