使用变量来定义其他变量

问题描述

我正在尝试定义一些变量以使我的舵图不可重复

我创建了一个帮助文件,其中包含以下部分:

{{ $config := .Values.service }}
{{- range .Values.services }}
{{ $config.$serviceName }}
{{- define "{{ $serviceName }}.selectorLabels" -}}
app.kubernetes.io/name: {{ .name }}
app.kubernetes.io/instance: {{ .instance }}
{{- end -}}
{{- end -}}

values.yaml:

services:
- service1
- service2
- service3

service:
- service1:
    name: service1

- service2:
    name: service2
    
- service3:
    name: service3

但是一直提示错误字符 U+0024 ‘$’

你知道如何通过其他变量定义一个变量吗?

解决方法

Go text/template languagethe Sprig extensions 和 Helm 的本地扩展都无法定义具有动态名称的模板。 define 调用中的名称必须是固定字符串。文本/模板文档说明(在“嵌套模板定义”下):

模板定义必须出现在模板的顶层......定义操作通过提供字符串常量来命名正在创建的模板。

但是,模板采用(单个)参数。与其尝试为每个动态指定的值定义一个单独的模板,不如定义一个生成此内容的模板,然后使用动态设置调用它。

{{- define "selectorLabels" -}}{{/* <-- fixed name */-}}
{{/* .name is relative to the template parameter . */-}}
app.kubernetes.io/name: {{ .name }}
app.kubernetes.io/instance: {{ .instance }}
{{- end -}}

{{- range .Values.services }}
{{-/* . is one item from the services list */}}
{{ include "selectorLabels" . }}
{{- end -}}

您可能会发现更简单的 Helm 值结构也更易于使用。如果分解.Values.service,它是一个列表,其中每个列表都是一个单项字典,其中的键来自一个单独的列表。您可以将其构建为设置字典的单个平面列表,将项目名称作为 name: 值嵌入到结构中(例如 pod 规范中的 containers: 列表)。

services:
  - name: service1
    instance: foo
  - name: service2
    instance: bar
  - name: service3
    instance: baz