带有 helm 提供程序的 terraform 忽略图像更改

带有 helm 提供程序的 terraform 忽略图像更改

我正在使用带有 helm 提供程序的 terraform 来部署 helm 图表,一切都与 terraform 一起工作,问题是当应用程序已经在运行时,我从 gitlab 管道更改了图像标签。

因此,下次我运行 terraform 时,从 gitlab 部署的图像标签将会更改为前一个。

我尝试使用生命周期,这是我的 Terraform 代码:

resource "helm_release" "app1" {
  name      = "app1"
  namespace = "money"
  chart     = "stable/perl"

  set {
    name  = "image.repository"
    value = "docker.registry.local/app1-api"
  }

  set {
    name  = "replicaCount"
    value = "2"
  }
  set {
    name  = "image.tag"
    value = "1.0.1"
  }

  set {
    name  = "image.pullPolicy"
    value = "Always"
  }

  set {
    name  = "service.type"
    value = "ClusterIP"
  }

  lifecycle {
    ignore_changes = [for s in set : s.name if s.name == "image.tag"]
  }
}

地形应用:

A static list expression is required.

答案1

具体来说,对于 Helm 资源,您可以欺骗 Terraform 忽略同一“类型”的所有对象,这意味着您可以使用里面的三个对象(、、)之一set并忽略它们全部。set_sensitiveset_stringlifecycle

这是理想的吗?当然不是,但它确实有效。对象不可寻址的根本原因是这里

在您的示例中,它应该是这样的:

resource "helm_release" "app1" {
  set_string {
    name  = "image.tag"
    value = "1.0.1"
  }

  lifecycle {
    ignore_changes = [set_string]
  }
}

编辑:请注意,这ignore_changes是非常字面的,因为任何更新都会强制执行老的值来替换 Helm 中当前配置的任何内容。

示例:Terraform 已配置初始标签和初始标签replicaCount == 2。然后 CI/CD 系统执行其工作并更新标签。现在,如果您使用 Terraform 更改replicaCount初始标签,则会重新应用它,因为它是 Terraform 所知道的标签……

相关内容