簡體   English   中英

Helm:生成逗號分隔列表

[英]Helm: generate comma separated list

使用 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

它什么也不產生。

我知道 range 塊內的行是空操作,因為每次循環迭代時變量 $zkservers 都是一個新變量。 它與外部作用域中的 $zkservers 不是同一個變量。

我希望我的意圖是明確的。 我不知道該怎么做。

有人知道如何使用 Helm 模板做到這一點嗎?

對於 2020 年以后的人來說,現在可以像這樣簡單地實現:

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

它產生正確的輸出: value: "test1,test2,test3"

至少它適用於(或多或少)最新版本的 helm-cli:

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

另一種快速的方法:

{{- 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圖表,它是用於類似目的的實用程序集合。

我遇到了同樣的問題,而使用字典的解決方案挽救了我的一天。 這是一個很好的解決方法,它可以更簡單一點:

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

您當前正在列表范圍內定義一個新變量,同時您想要更改現有值。

為了修復您的錯誤,您只需要更改將值分配給$zkservers

    - {{- $zkservers := print "zk-" . ".zookeeper" | append $zkservers -}}
    + {{- $zkservers = print "zk-" . ".zookeeper" | append $zkservers -}}  

它為您提供以下腳本:

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

通過這個輕微的修改, {{ include "zkservers" 3 }}給你輸出zk-0.zookeeper,zk-1.zookeeper,zk-2.zookeeper

我也在做同樣的事情,但在 elasticsearch 掌舵圖上。 請找到我的例子

值.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"

...

我使用它工作:

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

對於通常應該是簡單的單/雙襯里的東西來說似乎有點冗長:)

只渲染然后修剪怎么樣?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM