Я хочу создать несколько шаблонов KafkaConnector из значений.yaml, но с конкретной картой.
экземплярvalues.yaml:
Definition:
Information:
- db.user:
name: aaa
key: bbb
- db.secret:
name: aaa
key: ccc
- db.host: hosntame
- db.port: 1234
Information1:
- db.user:
name: zzz
key: yyy
- db.secret:
name: zzz
key: vvv
- db.host: hosntame1
- db.port: 1235
Файл Connector.yaml
{{- range .Value.Definition }}
---
apiVersion: {{ $.Values.apiVersion }}
kind: KafkaConnector
metadata:
name: {{ include "common.names.fullname" $ }}-{{ .name }}
spec:
class: need
config:
{{ range $k, $v := .Value }}
{{ $k }}:
{{ if eq $k "db.secret" }}
${secrets:{{ $v.name }}/{{ $v.value }}}
{{ else }}
{{ $v.value }}
{{ end }}
{{ end }}
{{ end }}
В конце концов, мне хотелось бы получить что-то вроде этого:
apiVersion: apps/v1
kind: KafkaConnector
metadata:
name: connect-Information
spec:
class: need
config:
db.user: bbb
db.secret: ${secrets:aaa/ccc}
db.hostname: hostname
db.port: 1234
apiVersion: apps/v1
kind: KafkaConnector
metadata:
name: connect-Information1
spec:
class: need
config:
db.user: yyy
db.secret: ${secrets:zzz/vvv}
db.hostname: hostname1
db.port: 1235
Мне удалось выполнить цикл один раз только с информацией, но я не могу выполнить цикл по двум ключевым данным/информации1
потому что мне нужно сделать две петли.
это всего лишь модель, я могу ее изменить, мне просто хотелось бы успешно выполнить цикл и получить окончательный шаблон

Чтобы решить эту проблему, вам необходимо организовать ваши значения в подходящую структуру данных. Затем вам следует использовать диапазон для соответствующего перебора этого списка или словаря.
Вот решение:
значения.yaml
Definition:
Information:
db.user:
name: aaa
key: bbb
db.secret:
name: aaa
key: ccc
db.host: hosntame
db.port: 1234
Information1:
db.user:
name: zzz
key: yyy
db.secret:
name: zzz
key: vvv
db.host: hosntame1
db.port: 1235
Обратите внимание, что в values.yaml под Definition.Information вместо исходной структуры list используется словарь. Это изменение было сделано потому, что исходная структура имела неоднородные ключи, что делало ненужным использование списка. Использование dictionary — лучший подход.
соединитель.yaml
{{- range $infoKey, $infoVal := .Values.Definition }}
---
apiVersion: {{ $.Values.apiVersion }}
kind: KafkaConnector
metadata:
name: test-{{ $infoKey }}
spec:
class: need
config:
{{- range $k, $v := $infoVal }}
{{- if eq $k "db.secret" }}
{{ $k }}: ${secrets: {{ $v.name }}/{{ $v.key }}}
{{- else if eq $k "db.user" }}
{{ $k }}: {{ $v.key }}
{{- else }}
{{ $k }}: {{ $v }}
{{- end }}
{{- end }}
{{- end }}
Кроме того, вам необходимо помнить об использовании символа «-» внутри {{- }}, чтобы правильно удалить ненужные символы пробелов.
выход
---
apiVersion:
kind: KafkaConnector
metadata:
name: test-Information
spec:
class: need
config:
db.host: hosntame
db.port: 1234
db.secret: ${secrets: aaa/ccc}
db.user: bbb
---
apiVersion:
kind: KafkaConnector
metadata:
name: test-Information1
spec:
class: need
config:
db.host: hosntame1
db.port: 1235
db.secret: ${secrets: zzz/vvv}
db.user: yyy
ps: helm doc: Помимо списков и кортежей, range можно использовать для перебора коллекций, у которых есть ключ и значение (например, карта или словарь).
Зачем вам использовать
Information,Information1(и т. д.) в виде списков, аDefinitionв качестве словаря? Должно быть наоборот, чтобы быть эффективным и соответствовать вашим потребностям.