Можно ли использовать шаблон внутри шаблона с шаблоном go

Используя https://golang.org/pkg/text/template/, мне иногда нужно использовать переменные в доступном пути (для развертываний Kubernetes).

В итоге я пишу что-то вроде:

{{ if (eq .Values.cluster "aws" }}{{ .Values.redis.aws.masterHost | quote }}{{else}}{{ .Values.redis.gcp.masterHost | quote }}{{end}}

То, что я действительно хотел бы написать, - это в значительной степени {{ .Values.redis.{{.Values.cluster}}.masterHost | quote }}, который не компилируется.

Есть ли способ написать что-то подобное? (так что в доступном пути есть своего рода переменная).


person C4stor    schedule 16.11.2018    source источник
comment
.Values.redis карта или структура? Или что-то другое?   -  person icza    schedule 16.11.2018
comment
Я считаю, что это структура   -  person C4stor    schedule 16.11.2018
comment
Я спрашиваю, потому что, если это карта, вы можете использовать {{index}}. Если это структура, вы можете добавить к ней методы.   -  person icza    schedule 16.11.2018
comment
Это карта, и index - правильный ответ.   -  person David Maze    schedule 16.11.2018


Ответы (1)


Вы можете использовать файл _helpers.tpl для определения логики и работы со значениями.

_helpers.tpl

{{/*
Get redis host based on cluster.
*/}}
{{- define "chart.getRedis" -}}
{{- if eq .Values.cluster "aws" -}}
{{- .Values.redis.aws.masterHost | quote -}}
{{- else -}}
{{- .Values.redis.gcp.masterHost | quote -}}
{{- end -}}
{{- end -}}

values.yaml

cluster: local
redis:
  aws:
    masterHost: "my-aws-host"
  gcp:
    masterHost: "my-gcp-host"

И используйте его в своем развертывании (вот пример ConfigMap, чтобы он был короче)

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: Configmap
data:
  redis: {{ template "chart.getRedis" . }}

Вывод:

helm install --dry-run --debug mychart

[debug] Created tunnel using local port: '64712'

...

COMPUTED VALUES:
cluster: local
redis:
  aws:
    masterHost: my-aws-host
  gcp:
    masterHost: my-gcp-host

HOOKS:
MANIFEST:

---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: Configmap
data:
  redis: "my-gcp-host"

Установите для кластера значение aws:

helm install --dry-run --debug mychart --set-string=cluster=aws

[debug] Created tunnel using local port: '64712'

...

COMPUTED VALUES:
cluster: local
redis:
  aws:
    masterHost: my-aws-host
  gcp:
    masterHost: my-gcp-host

HOOKS:
MANIFEST:

---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: Configmap
data:
  redis: "my-aws-host"
person edbighead    schedule 23.11.2018