Я использую terraform с поставщиком helm для развертывания диаграммы 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"]
}
}
terraform apply:
A static list expression is required.
В частности, для ресурса Helm вы можете обманом заставить Terraform игнорировать все объекты одного и того же «типа», то есть вы можете использовать один из трех объектов (set
, set_sensitive
, set_string
) внутри жизненного цикла
и игнорировать их все.
Это идеально? Конечно нет, но это работает. Основная причина того, почему объекты не адресуются, находится здесь.
В вашем примере это будет примерно так:
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 знает о нем...