是否可以通过选择每个地图中存在的键来整齐地展平来自 values.yaml 的地图列表?
Is it possible to neatly flatten a list of maps from values.yaml by selecting a key present in each map?
假设我有一个 values.yaml
,其中包含以下任意长度的地图列表:
values.yaml
-----------
people:
- name: "alice"
age: 56
- name: "bob"
age: 42
我的堆栈中的一个容器需要访问仅包含名称的列表。 (NAMES="alice,bob"
)
到目前为止,我想出了以下解决方案:
templates/_helpers.tpl
----------------------
{{- define "list.listNames" -}}
{{ $listStarted := false }}
{{- range .Values.people }}
{{- if $listStarted }},{{- end }}{{ $listStarted = true }}{{ .name }}
{{- end }}
{{- end }}
templates/configmap.yaml
------------------------
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
NAMES: '{{- include "list.listNames" . }}'
这个解决方案可行,但感觉不够优雅。查看 Helm 文档,这似乎是 pluck
与 join
结合的完美用例,但我还没有找到使用 .Values.people
作为参数的方法那个功能。
有更简洁的方法吗?
有一个 join
函数。
我有两种不同的解决方案可以利用 join
:
解决方案 1
我无法收集列表中的名称。因此我使用字典并稍后提取密钥:
{{- define "list.listNames" -}}
{{- $map := dict }}
{{- range .Values.people }}
{{- $_ := set $map .name "" }}
{{- end }}
{{- keys $map | join "," }}
{{- end }}
此解决方案可能 change the order。也许 sortAlpha
可以解决这个问题。
解决方案 2
因为函数必须return一个映射,所以我需要添加一个键。否则你不能通过 fromYaml
:
转换成字典
templates/_helpers.tpl
----------------------
{{- define "list.listNames" -}}
items:
{{- range .Values.people }}
- {{ .name }}
{{- end }}
{{- end }}
然后我通过fromYaml
转换为dict对象并加入列表:
templates/configmap.yaml
------------------------
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $items := include "list.listNames" . | fromYaml }}
NAMES: {{ $items.items | join "," | quote }}
假设我有一个 values.yaml
,其中包含以下任意长度的地图列表:
values.yaml
-----------
people:
- name: "alice"
age: 56
- name: "bob"
age: 42
我的堆栈中的一个容器需要访问仅包含名称的列表。 (NAMES="alice,bob"
)
到目前为止,我想出了以下解决方案:
templates/_helpers.tpl
----------------------
{{- define "list.listNames" -}}
{{ $listStarted := false }}
{{- range .Values.people }}
{{- if $listStarted }},{{- end }}{{ $listStarted = true }}{{ .name }}
{{- end }}
{{- end }}
templates/configmap.yaml
------------------------
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
NAMES: '{{- include "list.listNames" . }}'
这个解决方案可行,但感觉不够优雅。查看 Helm 文档,这似乎是 pluck
与 join
结合的完美用例,但我还没有找到使用 .Values.people
作为参数的方法那个功能。
有更简洁的方法吗?
有一个 join
函数。
我有两种不同的解决方案可以利用 join
:
解决方案 1
我无法收集列表中的名称。因此我使用字典并稍后提取密钥:
{{- define "list.listNames" -}}
{{- $map := dict }}
{{- range .Values.people }}
{{- $_ := set $map .name "" }}
{{- end }}
{{- keys $map | join "," }}
{{- end }}
此解决方案可能 change the order。也许 sortAlpha
可以解决这个问题。
解决方案 2
因为函数必须return一个映射,所以我需要添加一个键。否则你不能通过 fromYaml
:
templates/_helpers.tpl
----------------------
{{- define "list.listNames" -}}
items:
{{- range .Values.people }}
- {{ .name }}
{{- end }}
{{- end }}
然后我通过fromYaml
转换为dict对象并加入列表:
templates/configmap.yaml
------------------------
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $items := include "list.listNames" . | fromYaml }}
NAMES: {{ $items.items | join "," | quote }}