用 Helm 压平字典
Flatten Dictionary with Helm
有没有办法用 helm 压平字典?我想通过展平位于 values.yaml 中的 YAML 配置来为图表中的应用程序提供环境变量。配置看起来像。 (不实际)
config:
server:
port: 3333
other:
setting:
name: test
并希望提供环境变量作为
- name: CONFIG_SERVER_PORT
value: 3333
- name: CONFIG_OTHER_SETTING_NAME
value: test
我考虑过使用 Kubernetes 配置映射,但这意味着使用随机版本名称部署略有不同的应用程序实例,这样配置就不会被覆盖。
这个库 https://github.com/jeremywohl/flatten 提供了一种用分隔符来扁平化 map[string]interface{}
的方法。有没有办法为使用该库的 helm 提供自定义管道或其他方式来展平配置?
可能不会。您也许可以使用一些 Sprig 函数和大量局部变量在纯 Gotpl 中实现它,但是……不要。您不能在不重新编译的情况下向 Helm 添加自定义功能。直接使用原生格式即可。
你问的问题是可以的。附近没有资源。
但尝试这样的事情。
// chart
apiVersion: apps/v1beta1
kind: Deployment
spec:
template:
spec:
containers:
- name: {{ template "name" . }}
command: [{{ range $i, $e := .Values.container.command }}{{ if $i }}, {{$e|quote}}{{else}}{{$e|quote}}{{end}}{{end}}]
env:
{{- range .Values.container.env }}
- name: {{ .name }}
value: "{{ .value }}"
{{- end }}
// values
container:
command: ["cmd", "sub_cmd", "sub_sub_cmd"]
env:
- name: CONFIG_SERVER_PORT
value: 3333
- name: CONFIG_OTHER_SETTING_NAME
value: test
我不知道有什么内置的东西。Sprig provides most of the useful functions for helm templates but the dict functions 只介绍原语。
您可以 define
一个 named template 执行业务并递归配置 dict/map。然后 include
需要的模板:
{{- define "recurseFlattenMap" -}}
{{- $map := first . -}}
{{- $label := last . -}}
{{- range $key, $val := $map -}}
{{- $sublabel := list $label $key | join "_" | upper -}}
{{- if kindOf $val | eq "map" -}}
{{- list $val $sublabel | include "recurseFlattenMap" -}}
{{- else -}}
- name: {{ $sublabel | quote }}
value: {{ $val | quote }}
{{ end -}}
{{- end -}}
{{- end -}}
这里通过 list
传递 config
数据有点复杂,然后将其分离回 $map
和 $label
。这是因为模板只接受单个变量 scope.
env: {{ list .Values.config "CONFIG" | include "recurseFlattenMap" | nindent 2 }}
使用示例值:
config:
server:
port: 3333
first: astr
other:
setting:
name: test
结果
$ helm template .
---
# Source: so61280873/templates/config.yaml
env:
- name: "CONFIG_FIRST"
value: "astr"
- name: "CONFIG_OTHER_SETTING_NAME"
value: "test"
- name: "CONFIG_SERVER_PORT"
value: "3333"
可能不完美:
{{- range $key, $value := (regexReplaceAll ":\n( )+" (toYaml .Values) "_" | fromYaml) }}
{{ printf "- %s: %s" $key $value }}
{{- end }}
其中 .Values
的形式为
values:
- key:
subKey: value
- key
subKey2: value2
我想要
- key_subkey: value
- key2_subKey2: value2
具体来说,这是因为使用 helmfile 将多个单独的 helm 图表管理为一个精心策划的命令,希望将环境值折叠到一个 configmap 图表中,这样 pods 可以 envFrom.configMapRef 加载环境配置helmfile 作为环境变量
有没有办法用 helm 压平字典?我想通过展平位于 values.yaml 中的 YAML 配置来为图表中的应用程序提供环境变量。配置看起来像。 (不实际)
config:
server:
port: 3333
other:
setting:
name: test
并希望提供环境变量作为
- name: CONFIG_SERVER_PORT
value: 3333
- name: CONFIG_OTHER_SETTING_NAME
value: test
我考虑过使用 Kubernetes 配置映射,但这意味着使用随机版本名称部署略有不同的应用程序实例,这样配置就不会被覆盖。
这个库 https://github.com/jeremywohl/flatten 提供了一种用分隔符来扁平化 map[string]interface{}
的方法。有没有办法为使用该库的 helm 提供自定义管道或其他方式来展平配置?
可能不会。您也许可以使用一些 Sprig 函数和大量局部变量在纯 Gotpl 中实现它,但是……不要。您不能在不重新编译的情况下向 Helm 添加自定义功能。直接使用原生格式即可。
你问的问题是可以的。附近没有资源。 但尝试这样的事情。
// chart
apiVersion: apps/v1beta1
kind: Deployment
spec:
template:
spec:
containers:
- name: {{ template "name" . }}
command: [{{ range $i, $e := .Values.container.command }}{{ if $i }}, {{$e|quote}}{{else}}{{$e|quote}}{{end}}{{end}}]
env:
{{- range .Values.container.env }}
- name: {{ .name }}
value: "{{ .value }}"
{{- end }}
// values
container:
command: ["cmd", "sub_cmd", "sub_sub_cmd"]
env:
- name: CONFIG_SERVER_PORT
value: 3333
- name: CONFIG_OTHER_SETTING_NAME
value: test
我不知道有什么内置的东西。Sprig provides most of the useful functions for helm templates but the dict functions 只介绍原语。
您可以 define
一个 named template 执行业务并递归配置 dict/map。然后 include
需要的模板:
{{- define "recurseFlattenMap" -}}
{{- $map := first . -}}
{{- $label := last . -}}
{{- range $key, $val := $map -}}
{{- $sublabel := list $label $key | join "_" | upper -}}
{{- if kindOf $val | eq "map" -}}
{{- list $val $sublabel | include "recurseFlattenMap" -}}
{{- else -}}
- name: {{ $sublabel | quote }}
value: {{ $val | quote }}
{{ end -}}
{{- end -}}
{{- end -}}
这里通过 list
传递 config
数据有点复杂,然后将其分离回 $map
和 $label
。这是因为模板只接受单个变量 scope.
env: {{ list .Values.config "CONFIG" | include "recurseFlattenMap" | nindent 2 }}
使用示例值:
config:
server:
port: 3333
first: astr
other:
setting:
name: test
结果
$ helm template .
---
# Source: so61280873/templates/config.yaml
env:
- name: "CONFIG_FIRST"
value: "astr"
- name: "CONFIG_OTHER_SETTING_NAME"
value: "test"
- name: "CONFIG_SERVER_PORT"
value: "3333"
可能不完美:
{{- range $key, $value := (regexReplaceAll ":\n( )+" (toYaml .Values) "_" | fromYaml) }}
{{ printf "- %s: %s" $key $value }}
{{- end }}
其中 .Values
的形式为
values:
- key:
subKey: value
- key
subKey2: value2
我想要
- key_subkey: value
- key2_subKey2: value2
具体来说,这是因为使用 helmfile 将多个单独的 helm 图表管理为一个精心策划的命令,希望将环境值折叠到一个 configmap 图表中,这样 pods 可以 envFrom.configMapRef 加载环境配置helmfile 作为环境变量