如何在Helm嵌套Range中访问父级Range的Values值?
解决Helm模板嵌套Range访问外部变量问题
在Helm模板的嵌套Range场景中,内部Range的上下文(.)会覆盖外部上下文,导致无法直接访问外部Range的属性。你可以通过定义命名变量的方式解决这个问题,具体实现如下:
修改后的模板代码
方式一:保留原有with块,新增外部变量
receivers: {{- if .Values.emailReceivers }} {{- with .Values.emailReceivers }} {{- range $receiver := . }} - name: {{ .name }} emailConfigs: {{- range .targets }} - to: {{ . }} text: {{ $receiver.text }} sendResolved: {{ $receiver.sendResolved }} {{- end }} {{- end }} {{- end }}
方式二:简化结构,明确命名所有变量
receivers: {{- range $receiver := .Values.emailReceivers }} - name: {{ $receiver.name }} emailConfigs: {{- range $target := $receiver.targets }} - to: {{ $target }} text: {{ $receiver.text }} sendResolved: {{ $receiver.sendResolved }} {{- end }} {{- end }}
核心原理
Helm模板中,以$开头的变量属于全局作用域变量,在嵌套代码块中不会被上下文覆盖。我们在外部Range中把当前遍历到的接收器对象赋值给$receiver,这样在内部遍历targets的Range里,即使.已经变成单个邮箱地址,依然可以通过$receiver访问到外部接收器的text和sendResolved属性。
验证输出
使用上述模板生成的内容会完全符合预期:
receivers: - name: 'receiver 1' emailConfigs: - to: 'mail1@example.com' text: 'exampletext 1' sendResolved: true - to: 'mail2@example.com' text: 'exampletext 1' sendResolved: true - name: 'receiver 2' emailConfigs: - to: 'mail3@example.com' text: 'exampletext 2' sendResolved: false - to: 'mail4@example.com' text: 'exampletext 2' sendResolved: false
内容的提问来源于stack exchange,提问作者ih16
相关产品推荐
相关产品推荐

