Как получить доступ к отдельному элементу из списка внутри диаграммы helm

#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, вероятно, также решит проблему.