Я использую terraform с поставщиком helm для развертывания диаграммы helm, все работает с terraform, проблема в том, что приложение уже запущено, и я изменил тег изображения из конвейера gitlab.
Поэтому в следующий раз, когда я запущу terraform, тег изображения, развернутый из gitlab, будет изменен на предыдущий.
Я пробовал использовать жизненный цикл, это мой код терраформы:
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"]
}
}
terraform применить:
A static list expression is required.
В частности, для ресурса 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 ...