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 扩展中解包或分配这样的整个对象的首选方法是什么?
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插入一个前导换行符来使模板更紧凑一些。
| 归档时间: |
|
| 查看次数: |
1958 次 |
| 最近记录: |