在Helm模板中解压Go地图值

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

我似乎无法为Go模板/ Helm中想像的东西找到一个简单有效的解决方案。基本上给定一个values.yaml像这样:

ingress:
  hosts:
  - host: busy-a.local
    paths:
    - backend:
        serviceName:busy-a
        servicePort: 80
      path: /busy/[A-Z0-9]{1}

以及类似的template / 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扩展中,像这样解包或分配整个对象的首选方法是什么?

go kubernetes-helm go-templates
1个回答
0
投票

头盔具有a couple of barely-documented functions,其中之一是toYaml。这将接受任意对象,并将其以YAML格式写出(不缩进)。

根据您的情况,可以通过组合toYamlindent实现您想要的目标:

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插入lead换行符以使模板更加紧凑。

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