Helm模板判断值不存在或属于列表时渲染CronJob的方法
Helm模板条件判断正确实现
原代码错误原因
你写的模板有三个核心问题,导致逻辑不符合预期:
- 第一个判断分支逻辑写反:需求是「
.env字段不存在时直接渲染」,原代码写的or .env是只要.env存在就满足条件,和需求完全相反 - 函数使用错误:
hasKey的作用是判断字典(map)类型是否包含指定键,无法用来判断列表是否包含某个值,列表包含判断需要用Sprig内置的has函数 - 变量未正确取值:你把
$.Values.environment_variables.STAGE放在双引号内,模板会将其识别为固定字符串,不会读取配置里的实际STAGE值
正确模板代码
提前把全局STAGE值存为变量,避免range循环内作用域变化导致取值异常,条件严格匹配需求规则:
{{- /* 提前读取全局环境配置,避免循环作用域问题 */ -}} {{- $currentStage := $.Values.environment_variables.STAGE }} {{- range $.Values.tasks }} {{- /* 判定规则:1. 任务未配置env则始终渲染;2. 配置了env则校验当前stage是否在env列表内 */ -}} {{- if or (not .env) (has $currentStage .env) }} apiVersion: batch/v1 kind: CronJob metadata: name: {{ .name }} # 此处补全你的CronJob其余配置即可 spec: schedule: # 你的定时规则 jobTemplate: # 你的Job模板配置 --- {{- end }} {{- end }}
逻辑校验(对应给出的values配置)
当前全局STAGE值为dev,三个任务的渲染结果如下:
test-production-dev:配置了env列表[production, dev],dev在列表内 → 正常渲染test-dev:配置了env列表[dev],dev在列表内 → 正常渲染test-all:未配置env字段 → 正常渲染
如果将STAGE改为production,则test-dev不会被渲染,test-all仍会正常渲染,完全匹配规则要求。
注意:如果担心多个资源之间的
---分隔符出现冗余(比如第一个任务不渲染时开头多出空分隔符),可以先把所有符合渲染条件的任务存入列表,再统一遍历渲染,常规场景下上述写法已经可以正常工作。
内容的提问来源于stack exchange,提问作者Amit Baranes
相关产品推荐
相关产品推荐

