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

时间:2017-12-06 07:12:30

标签: kubernetes go-templates kubernetes-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模板执行此操作?

7 个答案:

答案 0 :(得分:24)

对于2020年以后的用户,现在可以实现以下目标:

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

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

至少(或多或少)可使用最新版本的helm-cli:

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

答案 1 :(得分:9)

我遇到了同样的问题,your solution 字典节省了我的一天。这是一个很好的解决方法,它可以更简单一点:

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

答案 2 :(得分:9)

另一种快速的方法:

{{- 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图表,该图表是出于类似目的的实用程序集合。

答案 3 :(得分:2)

我使用了它:

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

对于通常应该是简单的一个/两个衬垫,似乎有点冗长:)

答案 4 :(得分:1)

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

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"

...

答案 5 :(得分:0)

您当前要在列表范围内定义新的变量,而您想更改现有值。

为了修复您的错误,您只需更改将值分配给$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

答案 6 :(得分:0)

先渲染然后修剪?

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