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
它什么都不产生。
我知道范围块中的行是空操作,因为每次循环迭代时变量 $zkservers 都是一个新变量。它与外部作用域中的 $zkservers 不是同一个变量。
我希望我的意图很明确,我想做什么。我不知道该怎么做。
有人知道如何使用 Helm 模板执行此操作吗?
我使用了它:
{{- 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 -}}
对于通常应该是简单的 one/two 衬里的东西来说似乎有点冗长 :)
我遇到了同样的问题, 使用 词典 拯救了我。这是一个很好的解决方法,它可以简单一点:
{{- 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 -}}
我也在做同样的事情,但在 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"
...
另一个快速的方法:
{{- 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 图表,它是用于类似目的的实用程序的集合。
您当前正在列表范围内定义一个新变量,同时您想要更改现有值。
为了修复你的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
只渲染然后修剪怎么样?
{{- include "template" . | trimSuffix "," -}}
对于 2020 年以后的人来说,现在可以这么简单地实现它:
{{ join "," .Values.some.array }}
它产生正确的输出:
value: "test1,test2,test3"
至少它适用于(或多或少)最新版本的 helm-cli:
Client: &version.Version{SemVer:"v2.16.2", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
使用 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 模板执行此操作吗?
我使用了它:
{{- 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 -}}
对于通常应该是简单的 one/two 衬里的东西来说似乎有点冗长 :)
我遇到了同样的问题,
{{- 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 -}}
我也在做同样的事情,但在 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"
...
另一个快速的方法:
{{- 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 图表,它是用于类似目的的实用程序的集合。
您当前正在列表范围内定义一个新变量,同时您想要更改现有值。
为了修复你的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
只渲染然后修剪怎么样?
{{- include "template" . | trimSuffix "," -}}
对于 2020 年以后的人来说,现在可以这么简单地实现它:
{{ join "," .Values.some.array }}
它产生正确的输出:
value: "test1,test2,test3"
至少它适用于(或多或少)最新版本的 helm-cli:
Client: &version.Version{SemVer:"v2.16.2", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}