如何通过Terraform正确配置ArgoCD的模板与触发器?
问题:Terraform配置Argo CD通知触发器/模板时YAML解析错误
现有Helm配置
resource "helm_release" "argocd" { namespace = kubernetes_namespace.argocd.metadata.0.name name = "argocd" repository = "https://argoproj.github.io/argo-helm" chart = "argo-cd" version = var.argocd_chart_version [...] }
待加载的触发器文件
触发器内容存于argocd/triggers.yaml,尝试过带/不带trigger.前缀:
trigger.on-created: | - description: Application is created. oncePer: app.metadata.name send: - app-created when: "true" trigger.on-deleted: | - description: Application is deleted. oncePer: app.metadata.name send: - app-deleted when: app.metadata.deletionTimestamp != nil
当前Set配置
set { name = "notifications.triggers" value = file("${path.module}/argocd/triggers.yaml") }
触发的错误
│ Error: YAML parse error on argo-cd/templates/argocd-configs/argocd-notifications-cm.yaml: error converting YAML to JSON: yaml: line 30: could not find expected ':' │ │ with module.prod.module.kubernetes.helm_release.argocd, │ on modules\kubernetes\argocd.tf line 19, in resource "helm_release" "argocd": │ 19: resource "helm_release" "argocd" {
解决方案
错误原因
直接将完整YAML文件内容作为notifications.triggers的value传入是错误的,Helm的set参数期望notifications.triggers是嵌套的键值对结构,而非包含trigger.xxx键的完整YAML字符串,导致渲染后的ConfigMap YAML格式混乱,触发解析错误。
方法1:动态加载文件(推荐)
先修改triggers.yaml,移除trigger.前缀,让文件内容直接对应notifications.triggers下的键值:
on-created: | - description: Application is created. oncePer: app.metadata.name send: - app-created when: "true" on-deleted: | - description: Application is deleted. oncePer: app.metadata.name send: - app-deleted when: app.metadata.deletionTimestamp != nil
模板文件templates.yaml做同样处理(移除templates.前缀)。
然后在Terraform中解析YAML文件,通过dynamic "set"遍历键值对逐个设置:
resource "helm_release" "argocd" { namespace = kubernetes_namespace.argocd.metadata.0.name name = "argocd" repository = "https://argoproj.github.io/argo-helm" chart = "argo-cd" version = var.argocd_chart_version locals { # 解析触发器和模板文件 notifications_triggers = yamldecode(file("${path.module}/argocd/triggers.yaml")) notifications_templates = yamldecode(file("${path.module}/argocd/templates.yaml")) } # 动态设置触发器 dynamic "set" { for_each = local.notifications_triggers content { name = "notifications.triggers.${set.key}" value = set.value } } # 动态设置模板 dynamic "set" { for_each = local.notifications_templates content { name = "notifications.templates.${set.key}" value = set.value } } }
方法2:加载独立的Values文件
创建一个专门的通知配置Values文件(比如argocd-notifications-values.yaml),将触发器和模板按Helm chart的结构编写:
notifications: triggers: on-created: | - description: Application is created. oncePer: app.metadata.name send: - app-created when: "true" on-deleted: | - description: Application is deleted. oncePer: app.metadata.name send: - app-deleted when: app.metadata.deletionTimestamp != nil templates: app-created: | message: "Application {{.app.metadata.name}} 已创建" # 其他模板配置
然后在helm_release中通过values参数加载该文件:
resource "helm_release" "argocd" { namespace = kubernetes_namespace.argocd.metadata.0.name name = "argocd" repository = "https://argoproj.github.io/argo-helm" chart = "argo-cd" version = var.argocd_chart_version values = [ # 加载你的基础Values文件(如果有) file("${path.module}/argocd/values.yaml"), # 加载通知配置文件 file("${path.module}/argocd/argocd-notifications-values.yaml") ] }
方法3:手动定义配置
如果无法使用文件加载,直接在Terraform中通过HereDoc定义:
resource "helm_release" "argocd" { namespace = kubernetes_namespace.argocd.metadata.0.name name = "argocd" repository = "https://argoproj.github.io/argo-helm" chart = "argo-cd" version = var.argocd_chart_version set { name = "notifications.triggers.on-created" value = <<EOT - description: Application is created. oncePer: app.metadata.name send: - app-created when: "true" EOT } set { name = "notifications.triggers.on-deleted" value = <<EOT - description: Application is deleted. oncePer: app.metadata.name send: - app-deleted when: app.metadata.deletionTimestamp != nil EOT } # 手动添加模板配置 set { name = "notifications.templates.app-created" value = <<EOT message: "Application {{.app.metadata.name}} 已创建" # 其他模板属性 EOT } }
内容的提问来源于stack exchange,提问作者Frederik
相关产品推荐
相关产品推荐

