使用值文件创建具有不同名称的ConfigMap的Helm命令

huangapple go评论57阅读模式
英文:

Helm create configmap with different names from values file

问题

请注意,你的模板文件似乎有一些语法错误,特别是在循环和条件语句中。以下是你期望的输出的修正模板:

{{- range $topic, $values := $.Values.topicsToRead }}
{{- if $values.multiPod }}
{{- range $values.region }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-{{ . }}
data:
  features.toml: |
    [features]
    x_enabled = false    
{{- end }}
{{- end }}
{{- end }}

你可以使用修正后的模板文件运行Helm命令来获得期望的输出。如果multiPodtrue,则它将创建基于region的多个ConfigMap;如果为false,则只会创建一个名为cm-storage的ConfigMap。

英文:

I'm trying to create configmaps with different names based on the multiPod variable in the values file. If the multiPod variable is set to True, then helm should create 3 CM based on the region and 1 CM based on the key like cm-storage or cm-compute. Please help me in achieving this use case. TIA

configMap.yaml

{{- range $keys, $values := $.Values.topicsToRead }}

{{- if $values.multiPod }}
{{- range $values.region }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-{{ . }}
data:
  features.toml: |
    [features]
    x_enabled = false
{{- end -}}
{{- end }}
{{- end }}

Values.yaml

topicsToRead:
  compute:
    multiPod: true
    region:
      - region815
      - region816
      - region817
  storage:
    multiPod: false
    region:
      - region715
      - region716
      - region717

Output:

❯ helm template -s templates/configmap.yaml .
---
# Source: helm-chart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region815
data:
  features.toml: |
    [features]
    x_enabled = false
---
# Source: helm-chart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region816
data:
  features.toml: |
    [features]
    x_enabled = false
---
# Source: helm-chart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region817
data:
  features.toml: |
    [features]
    x_enabled = false

Output I want:

❯ helm template -s templates/configmap.yaml .
---
# Source: helm-chart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region815
data:
  features.toml: |
    [features]
    x_enabled = false
---
# Source: helm-chart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region816
data:
  features.toml: |
    [features]
    x_enabled = false
---
# Source: helm-chart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region817
data:
  features.toml: |
    [features]
    x_enabled = false
---
# Source: helm-chart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-storage
data:
  features.toml: |
    [features]
    x_enabled = false

答案1

得分: 2

我认为你需要将这个内容分解成多个模板。你可以编写一个生成ConfigMap内容的模板:

{{- /* 生成一个ConfigMap。传入一个带有“name”键的字典作为参数。 */ -}}
{{- define "configmap" -}}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .name }}
data:
  features.toml: |
    [features]
    x_enabled = false    
{{ end -}}

有了这个模板之后,你可以从外部模板中调用它。由于它是一个独立的辅助模板,即使multiPod为false,你也可以调用它而无需复制模板内容。

{{- range $k, $v := $.Values.topicsToRead }}
  {{- if $v.multiPod }}
    {{- range $v.region }}
      {{- include "configmap" (dict "name" (printf "cm-%s" .)) -}}
    {{- end -}}
  {{- else -))
    {{- include "configmap" (dict "name" (printf "cm-%s" $k)) -}}
  {{- end -}}
{{- end -}}

(我已经为了可读性缩进了这个内容,但也确保了每个模板元素都有-空白控制标记。我主要使用了$v作为循环变量名称,以便与标准Helm.Values区分开来。)

我在这里使用的另一个技巧是dict。Helm模板只接受一个参数。我猜测你不是为每个ConfigMap生成相同的固定内容,所以我在这里做的是传递一个字典作为参数。我在外部模板中计算它的名称,然后在内部模板中可以引用它作为.name(参数变量.上的name字段)。你可以通过将它们包含在dict参数中来扩展此方法,以添加更多的“参数”。

英文:

I think you have to break this up into multiple templates. You can write a template that produces the ConfigMap content:

{{- /* Produce a ConfigMap.  Pass a dictionary with a key "name" as the
       parameter. */ -}}
{{- define "configmap" -}}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .name }}
data:
  features.toml: |
    [features]
    x_enabled = false    
{{ end -}}

Once you have this, then you can call it from the outer template. Since you have it as a separate helper template, you can invoke it without copying the template content even if multiPod is false.

{{- range $k, $v := $.Values.topicsToRead }}
  {{- if $v.multiPod }}
    {{- range $v.region }}
      {{- include "configmap" (dict "name" (printf "cm-%s" .)) -}}
    {{- end -}}
  {{- else -))
    {{- include "configmap" (dict "name" (printf "cm-%s" $k)) -}}
  {{- end -}}
{{- end -}}

(I've indented this for readability, but also made sure absolutely every template element has - whitespace-control markers. I've used $v as the loop variable name mostly to distinguish from the standard Helm .Values.)

The one other trick I've used here is the dict. A Helm template only takes a single parameter. I'm guessing you're not generating the same fixed content for every single ConfigMap, so what I've done here is to pass a dictionary as the parameter. I compute its name in the outer template, and then can refer to it as .name (the name field on the parameter variable .) in the inner template. You can extend this to add more "parameters" by including them in the dict parameter.

答案2

得分: 0

---
# 源自: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region815
data:
  features.toml: |
    [features]
    x_enabled = false    
---
# 源自: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region816
data:
  features.toml: |
    [features]
    x_enabled = false    
---
# 源自: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region817
data:
  features.toml: |
    [features]
    x_enabled = false    
---
# 源自: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-storage
data:
  features.toml: |
    [features]
    x_enabled = false    
英文:

templates/configmap.yaml

{{- range $keys, $values := $.Values.topicsToRead }}
{{- if $values.multiPod }}
{{- range $values.region }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-{{ . }}
data:
  features.toml: |
    [features]
    x_enabled = false    
{{- end }}
{{- else }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-{{ $keys }}
data:
  features.toml: |
    [features]
    x_enabled = false    
{{- end }}
{{- end }}

values.yaml

topicsToRead:
  compute:
    multiPod: true
    region:
      - region815
      - region816
      - region817
  storage:
    multiPod: false
    region:
      - region715
      - region716
      - region717

output

---
# Source: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region815
data:
  features.toml: |
    [features]
    x_enabled = false    
---
# Source: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region816
data:
  features.toml: |
    [features]
    x_enabled = false    
---
# Source: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-region817
data:
  features.toml: |
    [features]
    x_enabled = false    
---
# Source: test/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-storage
data:
  features.toml: |
    [features]
    x_enabled = false    

huangapple
  • 本文由 发表于 2023年3月7日 16:24:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/75659505.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定