在 Helm 模板中解压 Go 映射值

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


ingress:

  hosts:

  - host: busy-a.local

    paths:

    - backend:

        serviceName:busy-a

        servicePort: 80

      path: /busy/[A-Z0-9]{1}

和 templates/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 }}

backend但是,在 中“解压”地图不是更容易.paths range吗backend: {{.backend}}?然而,它似乎并不是那样工作的。


...

    paths:

      - path: /busy/[A-Z0-9]{3}

        backend: map[serviceName:busy-a servicePort:80]

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


繁花不似锦
浏览 76回答 1
1回答

小怪兽爱吃肉

Helm 有几个几乎没有记录的功能,其中之一是toYaml. 它接受任意对象并以 YAML 格式写出,不缩进。toYaml在您的情况下,您可以通过组合和来实现您想要的目标indent:spec:  ...            backend:{{ .backend | trim | indent 14 }}{{/* above line intentionally at left margin */}}由于toYaml可以很好地处理嵌套对象,因此考虑到您的输入和输出,我可能会将其应用到更高的位置:spec:  rules:  {{- range .Values.ingress.hosts }}    - host: {{ .host | quote }}      http:        paths: {{- .paths | toYaml | trim | nindent 10 }}  {{- end }}toYaml总是会发出一个尾随的换行符,所以我倾向于将trim其关闭,这样我就可以更好地控制它。在最后一个示例中,我使用nindent插入前导换行符来使模板更加紧凑。
打开App,查看更多内容
随时随地看视频慕课网APP