Назад | Перейти на главную страницу

В шаблоне руля, как я могу использовать элементы в одном списке для перебора другого списка

Я хочу предварительно заполнить кластер kubernetes пространствами имен и соответствующими секретами для наших приложений и сервисов. Для этого я хотел бы иметь возможность указать 2 списка, 1 список с секретами и 1 список с пространствами имен. Каждое пространство имен в списке содержит список секретов. Как этот values.yaml:

secrets:
  - name: secret1
    data: key1
  - name: secret2
    data: key2
  - name: secret3
    data: key3

namespaces:
  - name: app1
    secrets:
      - secret1
      - secret2
  - name: app2
    secrets:
      - secret1
      - secret3

Затем я хочу перебрать пространства имен, чтобы создать пространства имен, например:

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}

В этом цикле мне нужен еще один цикл внутри этого цикла, который создает секреты для каждого пространства имен с данными из списка секретов. Примерно так:

{{- range $secrets := .secrets }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .name }}
  namespace: {{ $namespaces.name }}
type: kubernetes.io/tls
data: $secrets.data
---
{{- end }}

Но если я помещу этот цикл внутрь цикла пространства имен, он просто создаст все секреты в списке секретов во всех пространствах имен. Как я могу сделать так, чтобы цикл создавал только секреты, указанные в списке пространств имен?
Я думаю, что это можно сделать с помощью функции индексации шаблона go, но я не знаю, как это сделать.

Я воспроизвел вашу проблему и нашел на нее ответ.

Ваш пример

Я использовал ваши yamls для создания пространств имен и изменил второе, так что теперь оно действительно работает.

values.yaml

secrets:
  - name: secret1
    data: key1
  - name: secret2
    data: key2
  - name: secret3
    data: key3

namespaces:
  - name: app1
    secrets:
      - secret1
      - secret2
  - name: app2
    secrets:
      - secret1
      - secret3

шаблоны / namespaces.yaml

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}

{{- range $namespace := .Values.namespaces }}                                                                               
{{- range $secret := $namespace.secrets }}                                                                                  
---                                                                                                                         
apiVersion: v1                                                                                                              
kind: Secret                                                                                                                
metadata:                                                                                                                   
  name: {{ $secret }}                                                                                                       
  namespace: {{ $namespace.name }}                                                                                          
type: kubernetes.io/tls                                                                                                     
data: $secrets.data                                                                                                         
---                                                                                                                         
{{- end }}                                                                                                                  
{{- end }}

Результат:

COMPUTED VALUES:
namespaces:
- name: app1
  secrets:
  - secret1
  - secret2
- name: app2
  secrets:
  - secret1
  - secret3
secrets:
- data: key1
  name: secret1
- data: key2
  name: secret2
- data: key3
  name: secret3

HOOKS:
MANIFEST:

---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: app1
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: app2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret1
  namespace: app1                  
type: kubernetes.io/tls
data: $secrets.data
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret2
  namespace: app1                  
type: kubernetes.io/tls
data: $secrets.data
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret1
  namespace: app2                  
type: kubernetes.io/tls
data: $secrets.data
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret3
  namespace: app2                  
type: kubernetes.io/tls
data: $secrets.data

Моя идея сделать это

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

values.yaml

Secret1:
- namespace1
- namespace2

Secret2:
- namespace2

шаблоны / namespaces.yaml

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}

шаблоны / secrets.yaml

{{- range .Values.Secret1 }}
---
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: null
  name: secret1
  namespace: {{ . }}
{{- end}}
{{- range .Values.Secret2 }}
---
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: null
  name: secret2
  namespace: {{ . }}
{{- end}}

Результат:

COMPUTED VALUES:
Secret1:
- namespace1
- namespace2
Secret2:
- namespace2
namespaces:
- name: namespace1
- name: namespace2

HOOKS:
MANIFEST:

---
# Source: mychart/templates/namespaces2.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: namespace1
---
# Source: mychart/templates/namespaces2.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: namespace2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1                                                                                                              
data:                                                                                                                       
  password: UyFCXCpkJHpEc2I=                                                                                                   
  username: ZGV2dXNlcg==                                                                                                      
kind: Secret                                                                                                                
metadata:                                                                                                                   
  creationTimestamp: null                                                                                                   
  name: secret1                                                                                                             
  namespace: namespace2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1                                                                                                              
data:                                                                                                                       
  password: ZGV2dXNlcg==                                                                                              
  username: UyFCXCpkJHpEc2I=                                                                                                    
kind: Secret                                                                                                                
metadata:                                                                                                                   
  creationTimestamp: null                                                                                                   
  name: secret2                                                                                                             
  namespace: namespace2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1                                                                                                              
data:                                                                                                                       
  password: UyFCXCpkJHpEc2I=                                                                                                   
  username: ZGV2dXNlcg==                                                                                                      
kind: Secret                                                                                                                
metadata:                                                                                                                   
  creationTimestamp: null                                                                                                   
  name: secret1                                                                                                             
  namespace: namespace1

Более подробную информацию об управлении потоком (если, иначе, если, диапазон) можно найти Вот.