在头盔模板中解压缩Go贴图值

在头盔模板中解压缩Go贴图值,go,kubernetes-helm,go-templates,Go,Kubernetes Helm,Go Templates,我似乎找不到一个简单有效的解决方案来解决我在Go模板/Helm中经常想到的问题。基本上,给定一个values.yaml,如下所示: ingress: hosts: - host: busy-a.local paths: - backend: serviceName:busy-a servicePort: 80 path: /busy/[A-Z0-9]{1} apiVersion: extensions/v1beta1 kind

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

ingress:
  hosts:
  - host: busy-a.local
    paths:
    - backend:
        serviceName:busy-a
        servicePort: 80
      path: /busy/[A-Z0-9]{1}
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 }}
还有一个模板/ingres.yaml,如下所示:

ingress:
  hosts:
  - host: busy-a.local
    paths:
    - backend:
        serviceName:busy-a
        servicePort: 80
      path: /busy/[A-Z0-9]{1}
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:
      - path: /busy/[A-Z0-9]{3}
        backend: map[serviceName:busy-a servicePort:80]
在Go模板中或使用Sprig扩展来解包或分配这样一个完整对象的首选方法是什么?

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
it off,这样我就可以更好地控制它了。在上一个示例中,我使用
nindent
插入一个前导换行符,以使模板更加紧凑。

一般来说,模板引擎无法找出如何使用正确的缩进等方式解包。引擎查找变量名并将其作为字符串写入。啊,这一点很好,很好,谢谢。