假设我有以下子图的values.yaml:
global:
ingress:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
add_header yyy "yyy";
tag: 123
port: 1234
ingress:
enabled: true
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
add_header xxx "xxx";
...
如何将 ingress.yaml 模板中的两个注释块合并在一起,从而产生:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations: |
add_header xxx "xxx";
add_header yyy "yyy";
...
有人提示从哪里开始吗?
这两个值都只是字符串,您可以依次写入它们,也可以在模板层连接它们。
因此,例如,对于这个特定的例子来说,应该接近工作的最小的东西可能是
{{- $key := "nginx.ingress.kubernetes.io/configuration-snippet" -}}
metadata:
annotations: |
{{ index .Values.ingress.annotations $key | trim | indent 4 }}
{{ index .Values.global.ingress.annotations $key | trim | indent 4 }}
这利用了 Helm 在模板层并不真正“理解”YAML 的事实;相反,模板会写出任意字符串,然后 Helm 会尝试解析它。所以你可以使用 YAML
|
块标量标记,然后在其下写出任意内容,只要缩进正确就可以了。
这个问题听起来像是一个更普遍的问题,即如何合并两个注释列表,通过连接字符串来组合各个值。 Helm 包含一组“字典模板函数”,它们通过就地改变字典来工作,这有点不寻常。您可以将其与记录不足的 toYaml
函数结合起来,以有效的 YAML 语法编写字典。
创建一个新字典,它是本地注释的副本。
{{- $annotations := deepCopy .Values.ingress.annotations -}}
{{- range $key, $value := .Values.global.ingress.annotations -}}
{{- $existing := get $annotations $key -}}
{{- $new := cat $existing $value -}}
{{- $_ := set $annotations $key $new -}}
{{- end -}}
metadata:
annotations:
{{ $annotations | toYaml | indent 4 }}
特别是在这里,我利用了如果键不存在则
返回空字符串的属性,这恰好是您在这种特殊情况下想要的。对于其他“减少值”类型的操作,您可能需要使用
hasKey
检查该值是否存在,或使用
default
值。