在 Helm 模板中解压 Go 地图值

4m1*_*m1r 2 go go-templates kubernetes-helm

我似乎无法找到一个简单有效的解决方案来解决我在 Go 模板/Helm 中经常出现的问题。基本上,给定一个 values.yaml 如下:

ingress:
  hosts:
  - host: busy-a.local
    paths:
    - backend:
        serviceName:busy-a
        servicePort: 80
      path: /busy/[A-Z0-9]{1}
Run Code Online (Sandbox Code Playgroud)

和这样的模板/ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{.Values.project}}-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ .path }}
            backend:
              serviceName: {{ .backend.serviceName }} # this works
              servicePort: {{ .backend.servicePort }} # but can we shorthand backend?
        {{- end }}
  {{- end }}
Run Code Online (Sandbox Code Playgroud)

但是,那岂不是更容易“解包”中backend的地图.paths range,像backend: {{.backend}}?但是,它似乎不是那样工作的。

...
    paths:
      - path: /busy/[A-Z0-9]{3}
        backend: map[serviceName:busy-a servicePort:80]
Run Code Online (Sandbox Code Playgroud)

在 Go 模板或 Sprig 扩展中解包或分配这样的整个对象的首选方法是什么?

Dav*_*aze 9

Helm 有几个几乎没有记录的函数,其中一个是toYaml. 这接受一个任意对象并以 YAML 格式将其写出,不缩进。

在您的情况下,您可以通过组合toYaml和来实现您想要的indent

spec:
  ...
            backend:
{{ .backend | trim | indent 14 }}
{{/* above line intentionally at left margin */}}
Run Code Online (Sandbox Code Playgroud)

由于toYaml可以很好地处理嵌套对象,考虑到您的输入和输出,我可能会将它应用到更高层次:

spec:
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths: {{- .paths | toYaml | trim | nindent 10 }}
  {{- end }}
Run Code Online (Sandbox Code Playgroud)

toYaml总是会发出一个尾随换行符,所以我倾向于trim关闭它,这样我就可以更好地控制它。在最后一个示例中,我使用nindent插入一个前导换行符来使模板更紧凑一些。