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文本。
解决步骤
- 打印渲染后的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
- 模板中添加空值判断:修改
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 # 其余内容不变
- 验证CI变量传递:检查GitHub Workflow中
redis_affinity等变量的赋值,确保是合法的YAML字符串(比如从配置文件读取或提前用yamlencode处理HCL对象)。如果是通过Workflow变量传入,要确认值没有被截断或格式错误。
内容的提问来源于stack exchange,提问作者Marwen Taallah
相关产品推荐
相关产品推荐

