我正在使用带有 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_sensitive
set_string
lifecycle
这是理想的吗?当然不是,但它确实有效。对象不可寻址的根本原因是这里。
在您的示例中,它应该是这样的:
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 所知道的标签……