#yaml #go-templates #sprig-template-functions
# #yaml #перейти-шаблоны #sprig-template-функции
Вопрос:
Я пытаюсь получить доступ к отдельному значению из массива, доступного в значениях.файл yaml из моей диаграммы helmchart. Мои значения.содержимое файла yaml
peer_cidr:
- x
- y
- z
Доступ из диаграммы helm :
{{- $dn_count := len .Values.no_of_peers }}
{{- $end := sub $dn_count 1 }}
"routes": [
{{- $root := . -}}
{{ range $i, $dn := until (atoi (printf "%d" (int64 .Values.no_of_peers))) }}
{ "dst": "{{ index $root "Values" "ipv4_routing" "peer_cidr_list" (printf "%d" ($i) ) }}", "gw": "{{ $root.Values.ipv4_routing.gateway}}"}
С помощью функции index iam, предоставляющей индекс, но iam сталкивается
с ошибкой ниже ошибка вызова индекса: невозможно индексировать фрагмент / массив с типом string
Пожалуйста, помогите
Ответ №1:
Вам не нужно имитировать цикл for в стиле C в шаблонах Helm. Вы можете напрямую range
просматривать массив и получать его содержимое непосредственно в теле цикла.
{{- $gw := .Values.ipv4_routing.gateway }}
"routes": [
{{- range .Values.ipv4_routing.peer_cidr_list }}
{ "dst": "{{ . }}", "gw": "{{ $gw }}" }
{{- end }}
]
(Это не будет вставляться ,
между элементами массива JSON, как написано; вы можете использовать $i, $dst := range ...
для получения элемента индекса при выполнении итерации или использовать синтаксис YAML вместо этого, если это позволяет контекст.)
Код шаблона в том виде, в каком вы его написали, содержит множество преобразований типов между целочисленными и строковыми типами; вероятно, большинство из них не нужны. Конкретная ошибка, которую вы получаете, заключается в том, что вы явно преобразуете индекс массива в строку перед его передачей index
, но элемент является массивом и использует числовую индексацию. Простое удаление printf "%d"
atoi
вызовов and, вероятно, также решит проблему.