Хелм использует шаблонную функцию внутри llops - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь использовать функцию {{ template }} на моем рулевом столе, но внутри al oop значение вызывает ошибку.

Сначала вот мой _helpers.tpl:

{{- define "traefik.deployNamespace" -}}
    {{ default "kube-system" .Values.deployNamespace }}
{{- end -}}

Я могу использовать эту переменную с {{ template "treafik.deployNamespace }} во всех шаблонах, ожидайте, когда внутри al oop:

# Iterates on allowed namespaces and creates the roles
{{- if .Values.allowedNamespaces }}
{{- range .Values.allowedNamespaces }}
# Rules for namespace: {{ . }}
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: {{ . }}-traefik-ingress-r
  namespace: {{ . }}
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: {{ . }}-traefik-ingress-rb
  namespace: {{ . }}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: {{ . }}-traefik-ingress-r
subjects:
- kind: ServiceAccount
  name: traefik-ingress-sa
  namespace: {{ template "traefik.deployNamespace" . }}
{{- end }}
{{- end }}

Я, вероятно, делаю $ctx неправильно, но я не знаю, что Я должен использовать там.

> % helm template .
Error: template: traefik/templates/_helpers.tpl:62:36: executing "traefik.deployNamespace" at <.Values.deployNamespace>: can't evaluate field Values in type strin

1 Ответ

1 голос
/ 10 апреля 2020

В нижней части файла у вас есть несколько вариантов использования переменной текущего контекста .. Внутри контекста {{ range }}...{{ end }} l oop, . устанавливается на элемент из списка, по которому вы перебираете.

# `.` in all three of these is the same thing (a string)
name: {{ . }}-traefik-ingress-rb
namespace: {{ . }}
namespace: {{ template "traefik.deployNamespace" . }}

Шаблоны обычно ожидают получения среды Helm верхнего уровня объект в качестве их параметра (объект словарного типа с "Charts", "Values" и т. д.). Вам нужно сохранить его вне вашей l oop в переменной, чтобы вы могли получить к нему доступ.

{{- $top := . }}
{{- range .Values.allowedNamespaces }}
...
  namespace: {{ template "traefik.deployNamespace" $top }}
...
{{- end }}
...