À l'aide de modèles Helm, j'essaie de générer une liste de noms de serveurs basée sur un nombre dans values.yaml. Le point de ce modèle est défini sur le nombre (c'est un float64).
{{- define "zkservers" -}}
{{- $zkservers := list -}}
{{- range int . | until -}}
{{- $zkservers := print "zk-" . ".zookeeper" | append $zkservers -}}
{{- end -}}
{{- join "," $zkservers -}}
{{- end -}}
Pour une entrée de, disons, 3 je m'attends à ce que cela produise:
zk-0.zookeeper,zk-1.zookeeper,zk-2.zookeeper
Cela ne produit rien.
Je comprends que la ligne dans le bloc de plage est un no-op puisque la variable $ zkservers est une nouvelle variable à chaque itération de la boucle. Ce n'est pas la même variable que les $ zkservers dans la portée externe.
J'espère que l'intention est claire de ce que je veux faire. Je ne sais pas comment faire.
Quelqu'un sait-il comment faire cela avec les modèles Helm?
J'ai fait face au même problème et votre solution avec dictionnaire a sauvé ma journée. C'est une bonne solution de contournement et cela peut être un peu plus simple:
{{- define "zkservers" -}}
{{- $zk := dict "servers" (list) -}}
{{- range int . | until -}}
{{- $noop := printf "zk-%d.zookeeper" . | append $zk.servers | set $zk "servers" -}}
{{- end -}}
{{- join "," $zk.servers -}}
{{- end -}}
Un autre moyen rapide de le faire:
{{- define "helm-toolkit.utils.joinListWithComma" -}}
{{- $local := dict "first" true -}}
{{- range $k, $v := . -}}{{- if not $local.first -}},{{- end -}}{{- $v -}}{{- $_ := set $local "first" false -}}{{- end -}}
{{- end -}}
Si vous donnez cette entrée comme:
test:
- foo
- bar
Et appelez avec:
{{ include "helm-toolkit.utils.joinListWithComma" .Values.test }}
Vous obtiendrez le rendu suivant:
foo,bar
Il s'agit du graphique d'OpenStack-Helm Helm-toolkit , qui est une collection d'utilitaires à des fins similaires.
Je l'ai fait fonctionner en utilisant:
{{- define "zkservers" -}}
{{- $dot := dict "nodes" (int .) "servers" (list) -}}
{{- template "genservers" $dot -}}
{{- join "," $dot.servers -}}
{{- end -}}
{{- define "genservers" -}}
{{- range until .nodes -}}
{{- $noop := print "zk-" . ".zookeeper" | append $.servers | set $ "servers" -}}
{{- end -}}
{{- end -}}
Semble un peu bavard pour ce qui devrait normalement être une simple doublure un/deux :)
Je faisais la même chose, mais sur le graphique de barre elasticsearch. Veuillez trouver mon exemple
values.yml:
...
replicaCount: 3
...
StatefulSets.yaml:
...
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.registry_address }}/{{ .Values.image.name }}:{{ .Chart.AppVersion }}"
env:
- name: ELASTICSEARCH_CLUSTER_NAME
value: "{{ .Values.env.ELASTICSEARCH_CLUSTER_NAME }}"
- name: ELASTICSEARCH_DISCOVERY_ZEN_PING_UNICAST_HOSTS
value: "{{ template "nodes" .Values }}"
...
_ helpers.tpl:
{{/* vim: set filetype=mustache: */}}
{{- define "nodes" -}}
{{- $nodeCount := .replicaCount | int }}
{{- range $index0 := until $nodeCount -}}
{{- $index1 := $index0 | add1 -}}
elasticsearch-{{ $index0 }}.elasticsearch{{ if ne $index1 $nodeCount }},{{ end }}
{{- end -}}
{{- end -}}
Cela produit une liste séparée par des virgules:
...
- name: ELASTICSEARCH_DISCOVERY_ZEN_PING_UNICAST_HOSTS
value: "elasticsearch-0.elasticsearch,elasticsearch-1.elasticsearch,elasticsearch-2.elasticsearch"
...
Pour ceux à partir de 2020+, cela peut maintenant être réalisé aussi simplement que cela:
{{ join "," .Values.some.array }}
Il produit la sortie correcte: value: "test1,test2,test3"
Au moins, cela fonctionne avec (plus ou moins) des versions récentes de helm-cli:
Client: &version.Version{SemVer:"v2.16.2", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
Que diriez-vous simplement de rendre et de rogner?
{{- include "template" . | trimSuffix "," -}}