带舵平底字典

问题描述 投票:0回答:3

有没有一种方法可以使带有词典的字典变平?我想通过展平位于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{}的方法。有没有一种方法可以为使用库的头盔提供自定义管道,或以另一种方法来扁平化配置?

go kubernetes kubernetes-helm go-templates
3个回答
0
投票

可能不是。您可能可以使用某些Sprig函数和许多局部变量在纯Gotpl中实现此功能,但是……不行。您不能在不重新编译自定义功能的情况下将其添加到Helm中。只需直接使用本机格式即可。


0
投票

您提出的问题是可能的。没有附近的消息来源。但是尝试这样的事情。

// 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


0
投票

[我不知道内置的东西。Sprig为头盔模板提供了大多数有用的功能,但dict functions仅覆盖了基元。

您可以definenamed 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 -}}

由于增加了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"
© www.soinside.com 2019 - 2024. All rights reserved.