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

GitHub Workflow中Terraform模块部署Redis Helm Chart的YAML转JSON报错

问题

在GitHub Workflow中通过Terraform模块部署Redis Helm Chart时,模块内的helm-values.yaml始终报“error converting YAML to JSON”语法错误。多次调整文件开头(修改注释、增减YAML文档标记)后,报错行号仍指向文件开头;但本地直接执行terraform apply时该文件完全正常运行。

相关代码与报错信息

初始helm-values.yaml内容

architecture: standalone

fullnameOverride: ${redis_deployment_name}
auth:
  password: ${redis_admin_password}
# auth:
#   existingSecret: redis
#   existingSecretPasswordKey: redis-password

master:
  ${ indent(2, redis_affinity) }
  ${ indent(2, redis_nodeSelector) }
  ${ indent(2, redis_default_tolerations) }
  persistence:
    enabled: false
  resources:
    limits:
      cpu: 350m
      memory: 700Mi
    requests:
      cpu: 100m
      memory: 256Mi

pdb:
  enabled: true

# Explicit activation of Redis Stream
redisStreamEnabled: true

报错信息

Error: ---> error converting YAML to JSON: yaml: line 19: did not find expected key architecture: standalone

Terraform模块代码

resource "helm_release" "redis" {
    timeout   = 240
    name      = "redis"
    namespace = var.namespace
    chart     = "oci://registry-1.docker.io/bitnamicharts/redis"
    version   = var.helm_chart_version
    values = [templatefile("${path.module}/manifests/redis-values.yaml", {
      redis_deployment_name     = var.redis_deployment_name
      redis_affinity            = var.redis_affinity
      redis_nodeSelector        = var.redis_nodeSelector
      redis_default_tolerations = var.redis_default_tolerations
      redis_admin_password      = var.redis_admin_password
    })]
}

模块调用代码

module "redis" {
    source = "git::https......"
    namespace                 = var.namespace
    redis_deployment_name     = var.redis_deployment_name
    redis_affinity            = var.redis_affinity
    redis_nodeSelector        = var.redis_nodeSelector
    redis_default_tolerations = var.redis_default_tolerations
    redis_admin_password      = "toto"
}

排查与解决

核心原因

本地执行正常但CI失败,大概率是GitHub Workflow中传入的变量格式/内容异常,导致templatefile渲染后生成的YAML存在语法错误。比如:

  • redis_affinity、redis_nodeSelector或redis_default_tolerations在CI环境中为空值,渲染后master节点下会出现无效的空缩进行,破坏YAML结构;
  • 变量本身不是合法的YAML字符串,比如传入了HCL对象而非格式化后的YAML文本。

解决步骤

  1. 打印渲染后的YAML内容:在GitHub Workflow中添加步骤,输出模板渲染后的实际YAML,定位语法问题。例如在Terraform apply前加:
terraform console <<EOF
templatefile("${path.module}/manifests/redis-values.yaml", {
  redis_deployment_name     = var.redis_deployment_name
  redis_affinity            = var.redis_affinity
  redis_nodeSelector        = var.redis_nodeSelector
  redis_default_tolerations = var.redis_default_tolerations
  redis_admin_password      = var.redis_admin_password
})
EOF
  1. 模板中添加空值判断:修改helm-values.yaml,对可能为空的变量做条件渲染,避免生成无效行:
master:
  ${ redis_affinity != "" ? indent(2, redis_affinity) : "" }
  ${ redis_nodeSelector != "" ? indent(2, redis_nodeSelector) : "" }
  ${ redis_default_tolerations != "" ? indent(2, redis_default_tolerations) : "" }
  persistence:
    enabled: false
  # 其余内容不变
  1. 验证CI变量传递:检查GitHub Workflow中redis_affinity等变量的赋值,确保是合法的YAML字符串(比如从配置文件读取或提前用yamlencode处理HCL对象)。如果是通过Workflow变量传入,要确认值没有被截断或格式错误。

内容的提问来源于stack exchange,提问作者Marwen Taallah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:20:00