Như helm đã mô tả:range
, which provides a “for each”-style loop
https://helm.sh/docs/chart_template_guide/control_structures/#looping-with-the-range-action
Nếu bạn có 1 value như sau:
ingress:
enabled: true
hosts:
- host: ad-ranker-staging.nimtechnology.com
paths:
- path: /
port: '8080'
- host: ad-ranker-staging-grpc.nimtechnology.com
paths:
- port: '9091'
protocol: grpc
- port: '9090'
protocol: grpc
chúng ta sẽ loop các phần tử của mang hosts, bạn có thể các gạch đầu dòng (-)
{{- range $index, $value := .Values -}}
{{- end -}}
{{- $typeValueEnvVars := list "string" "float64" "bool"}}
...
...
env:
{{- range $key, $value := .Values.envVars }}
{{- $tp := typeOf $value }}
{{- if has $tp $typeValueEnvVars }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- else }}
- name: {{ $key }}
{{- toYaml $value | nindent 12 }}
{{- end }}
{{- end }}
nó gần như các loại ngôn ngữ khác:
bắt đầu bằng range và kết thúc end
bạn loop array là Values lúc này để từng giá trị sẽ là $value và $index(thứ tự)
spec:
rules:
{{- range $index, $host := $.Values.ingress.hosts -}}
- host: $host.host
{{- end -}}
các bạn để ý là có tiếp tục chấm để đi vào các phần tử bên trong:$host.host
$host.paths
-> chỗ này chúng ta có thể range tiếp.
Đôi khi index cũng thử, bạn có thể bỏ đi:
{{- range $index, $value := .Values -}}
{{- end -}}
Thêm kiểu rút gọn hơn:
{{- range .Values.ingress.hosts }}
{{- if .host }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
pathType: ImplementationSpecific
backend:
service:
name: {{ $fullName }}
port:
number: {{ .port }}
{{- end }}
{{- end }}
{{- end }}
{{- range $indexGrpc, $hostGrpc := $.Values.ingress.hosts -}}
{{- end -}}
Mình nghe nói đôi khi vòng loop bị ngáo.
nếu bạn để $.Values thì nó lấy vị thứ 0 hay sát lề bên phải
with inside range
Để bạn có thể sự dụng range và vừa lấy được các giá trị ở ngoài vòng range thì phải khai báo {{ with $ }}