Как получить доступ к отдельному элементу из списка внутри диаграммы управления
Я пытаюсь получить доступ к отдельному значению из массива, доступного в файле values.yaml из моей диаграммы управления. Содержание моего файла values.yaml
peer_cidr:
- x
- y
- z
Доступ из карты управления:
{{- $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: невозможно проиндексировать срез / массив со строкой типа
Любезно помогите
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
звонки, вероятно, также решат проблему.