【问题标题】:Helm: generate comma separated listHelm:生成逗号分隔列表
【发布时间】:2018-05-20 00:14:12
【问题描述】:

使用 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 模板执行此操作吗?

【问题讨论】:

    标签: kubernetes go-templates kubernetes-helm


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这绝对是2020年最好的答案
    • 这不包括如何连接每个元素 zk-i.zookeepr 其中i 将是原始数组元素
    • 2021 年依然是正确答案
    • 奇怪我没有在 helm 函数列表中看到这个记录。 helm.sh/docs/chart_template_guide/function_list
    • @PaulMiller 确实如此。我认为在 helm3 模板方面最好转向 sprig 库文档,因为大多数功能都是从那里获取的 AFAIK:godoc.org/github.com/Masterminds/sprig Helm 维护人员还在您提供的文档底部提到了原始文档:@ 987654329@
    【解决方案2】:

    另一种快速的方法:

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

      我遇到了同样的问题,your solutiondictionary 拯救了我的一天。这是一个很好的解决方法,它可以更简单一点:

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

      【讨论】:

      【解决方案4】:

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

      为了修复你的bug,你只需要改变你给$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

      【讨论】:

      • 不错,比 dict 恶作剧更简单
      【解决方案5】:

      我也在做同样的事情,但在 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"
      
      ...
      

      【讨论】:

        【解决方案6】:

        我让它工作了:

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

        对于通常应该是简单的一/二衬里的东西来说似乎有点冗长:)

        【讨论】:

          【解决方案7】:

          渲染然后修剪怎么样?

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

          【讨论】:

            猜你喜欢
            • 2016-07-29
            • 2020-07-04
            • 2012-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-03
            相关资源
            最近更新 更多