You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:40:22