web-dev-qa-db-ja.com

Helm:カンマ区切りリストを生成します

Helmテンプレートを使用して、values.yamlの数値に基づいてサーバー名のリストを生成しようとしています。このテンプレートのドットは数値(そのfloat64)に設定されています。

{{- define "zkservers" -}}
{{- $zkservers := list -}}
{{- range int . | until -}}
{{- $zkservers := print "zk-" . ".zookeeper" | append $zkservers -}}
{{- end -}}
{{- join "," $zkservers -}}
{{- end -}}

たとえば、3の入力の場合、これにより以下が生成されると期待しています。

zk-0.zookeeper,zk-1.zookeeper,zk-2.zookeeper

それは何も生成しません。

変数$ zkserversはループが繰り返されるたびに新しい変数であるため、範囲ブロック内の行は何もしないことを理解しています。これは、外部スコープの$ zkserversと同じ変数ではありません。

私がやりたいことが明確になっているといいのですが。どうしたらいいのか途方に暮れている。

Helmテンプレートでこれを行う方法を知っている人はいますか?

14
alfred

私は同じ問題に直面し、 あなたの解決策dictionaryで私の一日を救った。これは優れた回避策であり、少しだけ簡単にすることができます。

{{- 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

それを行う別の簡単な方法:

{{- define "helm-toolkit.utils.joinListWithComma" -}}
{{- $local := dict "first" true -}}
{{- range $k, $v := . -}}{{- if not $local.first -}},{{- end -}}{{- $v -}}{{- $_ := set $local "first" false -}}{{- end -}}
{{- end -}}

次のように入力すると、

test:
- foo
- bar

そして次のように電話してください:

{{ include "helm-toolkit.utils.joinListWithComma" .Values.test }}

次のレンダリングが表示されます。

foo,bar

これは、OpenStack-Helmの Helm-toolkit チャートからのものです。これは、同様の目的のためのユーティリティのコレクションです。

17
Pete Birley

私はそれを使って動作させました:

{{- 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 -}}

通常はシンプルな1/2ライナーである必要があるので、少し冗長に見えます:)

3
alfred

私は同じことをしていましたが、elasticsearch helm chartを使用していました。私の例を見つけてください

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

これにより、コンマ区切りのリストが生成されます。

...
            - name: ELASTICSEARCH_DISCOVERY_ZEN_PING_UNICAST_HOSTS
              value: "elasticsearch-0.elasticsearch,elasticsearch-1.elasticsearch,elasticsearch-2.elasticsearch"

...

2020年以降のユーザーにとっては、次のように簡単に実現できます。

{{ join "," .Values.some.array }}

正しい出力が生成されます:value: "test1,test2,test3"

少なくともそれは(多かれ少なかれ)helm-cliの最近のバージョンで動作します:

Client: &version.Version{SemVer:"v2.16.2", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
1
Illya Dus

レンダリングしてトリミングするだけではどうですか?

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