【问题标题】:In teraform, is there a way to refresh the state of a resource using TF files without using CLI commands?在 terraform 中,有没有办法在不使用 CLI 命令的情况下使用 TF 文件刷新资源状态?
【发布时间】:2020-04-24 18:31:36
【问题描述】:

我需要在不使用 CLI 命令的情况下使用 TF 文件刷新资源“ibm_is_image”的状态?

我知道我们可以使用“terraform import”来导入资源的状态。但我应该在 TF 文件中使用 IaC 做同样的事情。

如何做到这一点?

例子:

在 workspace1 中,我创建了一个资源“f5_custom_image”,稍后会从命令行中删除该资源。在 workspace2 中,TF 文件中的相同代码将假定“f5_custom_image”已经存在,并且无法读取自定义图像资源。因此,我的代码必须在每次执行“terraform apply”时刷新此资源的 terraform 状态:

resource "ibm_is_image" "f5_custom_image" {
  depends_on       = ["data.ibm_is_images.custom_images"]
  href             = "${local.image_url}"
  name             = "${var.vnf_vpc_image_name}"
  operating_system = "centos-7-amd64"

  timeouts {
    create = "30m"
    delete = "10m"
  }
}

【问题讨论】:

  • 刷新状态只是检查提供程序以查看自 Terraform 上次运行以来是否发生了任何变化,并且由 Terraform 自动完成。在这种情况下,这就是正在发生的事情并导致您的第二个 Terraform 命令失败,因为该图像自上次运行以来已被删除,并且是您希望在此处发生的事情。您能否更清楚地解释您想要发生的事情,因为听起来您希望 Terraform 重新创建已删除的自定义图像。
  • 我希望使用已删除的自定义图像在第二个工作区中更新 terraform 状态,然后重新创建自定义图像。
  • Terraform 不会那样工作。您明确表示要使用现有图像,然后从中创建资源。您需要重新考虑如何管理图像或 Terraform 结构。
  • 我的自定义图像是使用 TF 文件创建的。我想在应用 terraform 后使用命令行销毁自定义图像。我的问题是:我当前和新的工作空间是否会刷新状态并使用 TF 文件创建另一个自定义图像?
  • 第一个会注意到它创建的图像在下一个计划中丢失并尝试重新创建它。第二个工作区(如果在应用第一个工作区之前计划)将出错,因为找不到自定义图像。如果您应用第一个然后计划第二个,那么它会很好,因为它会找到新图像。

标签: import refresh terraform


【解决方案1】:

在 Terraform 的模型中,一个对象完全由一个 Terraform 配置管理,没有别的。让一个对象由多个配置管理,或者让一个对象由 Terraform 创建但随后在 Terraform 之外删除是不受支持的工作流。

Terraform 旨在管理您将随着时间的推移逐渐更新的长期架构。它并非旨在管理构建工件,例如倾向于创建、使用然后销毁的机器映像。

这种用例的通常架构是将图像的创建视为“构建”步骤,使用 Terraform 之外的一些其他软件执行,然后我们仅将 Terraform 用于“部署”步骤,此时会创建或更新长期存在的基础架构以使用新映像。

这会导致构建和部署管道,其中包含以下一系列步骤:

  • 使用单独的图像构建软件来构建图像,并将 ID 记录在可以使用 Terraform 中的数据源检索的位置。
  • 运行terraform apply 以更新长期存在的基础架构以利用新映像。 Terraform 配置应包含一个 data 块,用于从上一步中记录的任何位置读取图像 ID。
  • 如果需要,请在 Terraform 完成后使用 Terraform 之外的软件销毁映像。

在实现这样的管道时,还可以考虑使用“回滚”过程以防新图像出现故障,这是可选的,但很常见:

  • 将 Terraform 正在读取的记录图像 ID 重置为在新构建步骤之前存储的 ID。
  • 运行 terraform apply 将长期存在的基础架构更新为使用旧映像。

当然,支持这一点需要保留以前的映像足够长的时间以证明新映像运行正常,因此正常的构建和部署管道每次运行都需要保留至少一个历史映像才能回滚。话虽如此,如果您有办法在回滚期间快速重新创建先前的图像,那么这个特殊的工作流程并不是严格需要的:相反,您可以通过“前滚”到使用先前配置构建的图像来实现回滚。

在其他云供应商上通常用于准备与 Terraform 一起使用的图像的示例软件包是 HashiCorp Packer,但遗憾的是它看起来不支持 IBM Cloud,因此您可能需要寻找一些类似的软件 确实支持 IBM Cloud,或者使用 IBM Cloud SDK 自己编写一些东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2020-09-12
    • 2019-07-07
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多