是否可以通过选择每个地图中存在的键来整齐地展平来自 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 文档,这似乎是 pluckjoin 结合的完美用例,但我还没有找到使用 .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 }}