如何在Helm Chart中按条件忽略指定模板?跳过特定前缀资源部署
Helm按条件过滤模板资源的实现方案
先修正你的Helper函数
你当前的statement.resource函数存在几个问题:循环内直接输出列表、未处理非x场景、路径判断逻辑不准确。以下是修正后的版本:
{{- define "statement.resource" -}} {{- $statementProvider := lower $.Values.statementProvider -}} {{- $statementFiles := list -}} {{- // 匹配templates下所有yaml格式的模板文件 {{- range $path, $bytes := .Files.Glob "templates/**.yaml" }} {{- $fileName := base $path -}} {{- if eq $statementProvider "x" }} {{- // 跳过文件名以y或z开头的模板 {{- if not (or (hasPrefix $fileName "y") (hasPrefix $fileName "z")) }} {{- $statementFiles = append $statementFiles $path -}} {{- end }} {{- else }} {{- // 非x场景下保留所有模板 {{- $statementFiles = append $statementFiles $path -}} {{- end }} {{- end }} {{- // 将最终列表转为JSON字符串,方便后续解析调用 {{- toJson $statementFiles -}} {{- end }}
如何使用这个Helper函数
Helm默认会自动渲染templates/下所有不以_开头的文件,要实现条件过滤,需要调整模板文件的组织方式:
重命名现有模板文件:把所有需要条件控制的模板文件前缀加上
_,比如y-deployment.yaml改成_y-deployment.yaml,z-service.yaml改成_z-service.yaml。这样Helm不会自动渲染这些文件,而是作为模板片段等待调用。创建主渲染入口:在
templates/下新建resources.yaml文件,内容如下:
{{- // 调用Helper函数获取符合条件的模板列表 {{- $targetFiles := include "statement.resource" . | fromJson -}} {{- // 逐个渲染选中的模板 {{- range $file := $targetFiles }} {{- include $file . }} {{- end }}
逻辑验证
- 当
values.yaml中配置statementProvider: x时,所有文件名以y/z开头的模板会被跳过,不会生成K8s资源; - 当
statementProvider为其他值时,所有模板都会被渲染并发送给K8s。
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

