在 Helm 中合并注释

问题描述 投票:0回答:1

假设我有以下子图的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";
...

有人提示从哪里开始吗?

yaml kubernetes-helm
1个回答
1
投票

这两个值都只是字符串,您可以依次写入它们,也可以在模板层连接它们。

因此,例如,对于这个特定的例子来说,应该接近工作的最小的东西可能是

{{- $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 语法编写字典。

在伪代码中,我可能会写:

创建一个新字典,它是本地注释的副本。
  1. 循环遍历全局注释。对于每个键,如果键不存在,则保存其值,但如果存在,则附加全局值。
  2. 将结果写入 YAML。
  3. 您可以将其翻译为 Helm 模板代码:

{{- $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 }}

特别是在这里,我利用了如果键不存在则 

get

 返回空字符串的属性,这恰好是您在这种特殊情况下想要的。对于其他“减少值”类型的操作,您可能需要使用 
hasKey
 检查该值是否存在,或使用 
default
值。
    

© www.soinside.com 2019 - 2024. All rights reserved.