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

Я пытаюсь получить доступ к отдельному значению из массива, доступного в файле 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 звонки, вероятно, также решат проблему.

Другие вопросы по тегам