web-dev-qa-db-fra.com

Helm: générer une liste séparée par des virgules

À 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?

14
alfred

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 -}}
10
DmiBay

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.

17
Pete Birley

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 :)

3
alfred

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"}
1
Illya Dus

Que diriez-vous simplement de rendre et de rogner?

{{- include "template" . | trimSuffix "," -}}
0
Aram