我似乎无法为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扩展中,像这样解包或分配整个对象的首选方法是什么?
头盔具有a couple of barely-documented functions,其中之一是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
插入lead换行符以使模板更加紧凑。