Helm:生成以逗号分隔的列表

alf*_*red 8 go-templates kubernetes kubernetes-helm

使用Helm模板,我试图根据values.yaml中的数字生成服务器名称列表.此模板的点设置为数字(其为float64).

{{- define "zkservers" -}}
{{- $zkservers := list -}}
{{- range int . | until -}}
{{- $zkservers := print "zk-" . ".zookeeper" | append $zkservers -}}
{{- end -}}
{{- join "," $zkservers -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

对于3的输入,我希望这会产生:

zk-0.zookeeper,zk-1.zookeeper,zk-2.zookeeper
Run Code Online (Sandbox Code Playgroud)

它什么都不产生.

我知道范围块中的行是无操作,因为每次循环迭代时变量$ zkservers都是一个新变量.它与外部作用域中的$ zkservers不是同一个变量.

我希望意图清楚我想做什么.我不知道怎么做.

任何人都知道如何使用Helm模板执行此操作?

Ill*_*oos 43

对于 2020 年以后的人来说,现在可以像这样简单地实现:

{{ join "," .Values.some.array }}
Run Code Online (Sandbox Code Playgroud)

它产生正确的输出: value: "test1,test2,test3"

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

Client: &version.Version{SemVer:"v2.16.2", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,我没有在舵函数列表中看到这个记录。https://helm.sh/docs/chart_template_guide/function_list (5认同)
  • 这绝对是2020年最好的答案 (3认同)
  • 这不包括如何连接每个元素“zk-i.zookeepr”,其中“i”将是原始数组元素 (3认同)
  • 2021 年它仍然是正确答案 (2认同)
  • @PaulMiller 确实如此。我认为在涉及 helm3 模板时最好转向 `sprig` 库文档,因为大多数函数都是从那里获取的:https://godoc.org/github.com/Masterminds/sprig Helm 维护者也提到了原始文档在您提供的文档底部:`注意,其中许多函数的文档来自 Sprig。Sprig 是一个可供 Go 应用程序使用的模板函数库。 (2认同)

小智 19

另一种快速的方法:

{{- define "helm-toolkit.utils.joinListWithComma" -}}
{{- $local := dict "first" true -}}
{{- range $k, $v := . -}}{{- if not $local.first -}},{{- end -}}{{- $v -}}{{- $_ := set $local "first" false -}}{{- end -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

如果您输入如下输入:

test:
- foo
- bar
Run Code Online (Sandbox Code Playgroud)

并致电:

{{ include "helm-toolkit.utils.joinListWithComma" .Values.test }}
Run Code Online (Sandbox Code Playgroud)

您将获得以下呈现:

foo,bar
Run Code Online (Sandbox Code Playgroud)

这是来自OpenStack-Helm的Helm-toolkit图表,它是用于类似目的的实用程序集合.


Dmi*_*Bay 11

我面临着同样的问题,您的解决方案字典救了我的一天.这是一个很好的解决方法,它可以更简单一些:

{{- 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 -}}
Run Code Online (Sandbox Code Playgroud)


Pie*_*ard 6

您当前正在列表范围内定义一个新变量,同时您想要更改现有值。

为了修复您的错误,您只需要更改为 分配值的方式$zkservers

    - {{- $zkservers := print "zk-" . ".zookeeper" | append $zkservers -}}
    + {{- $zkservers = print "zk-" . ".zookeeper" | append $zkservers -}}  
Run Code Online (Sandbox Code Playgroud)

它为您提供以下脚本:

{{- define "zkservers" -}}
{{- $zkservers := list -}}
{{- range int . | until -}}
{{- $zkservers = print "zk-" . ".zookeeper" | append $zkservers -}}
{{- end -}}
{{- join "," $zkservers -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

通过这个轻微的修改,{{ include "zkservers" 3 }}给你输出zk-0.zookeeper,zk-1.zookeeper,zk-2.zookeeper

  • 不错,比字典恶作剧简单 (3认同)

Вла*_*тин 5

我也在做同样的事情,但在 elasticsearch 掌舵图上。请找到我的例子

值.yml

...
replicaCount: 3
...
Run Code Online (Sandbox Code Playgroud)

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 }}"
...
Run Code Online (Sandbox Code Playgroud)

_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 -}}
Run Code Online (Sandbox Code Playgroud)

这会产生一个逗号分隔的列表:

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

...
Run Code Online (Sandbox Code Playgroud)