У меня есть способ сделать это, который включает в себя некоторые хитрости, в значительной степени вдохновленные опытом функционального программирования.
Шаблон Go / Helm принимает один параметр, но библиотека sprig дает вамвозможность создавать списки, а функция text / template index
позволяет выбирать объекты из списка.Это позволяет вам написать шаблон «функции», который принимает несколько параметров, упакованных в список.
Скажем, мы хотим вывести одну строку этого вывода.Нам нужно отслеживать, какой номер сервера у нас (глобально), какой номер реплики (в текущем центре обработки данных), текущая запись центра обработки данных и записи, которые мы еще не отправили.Если мы подошли к концу текущего списка, распечатайте записи для остальных центров обработки данных;в противном случае выведите одну строку для текущей реплики и повторите для следующего индекса сервера / реплики.
{{ define "emit-dc" -}}
{{ $server := index . 0 -}}
{{ $n := index . 1 -}}
{{ $dc := index . 2 -}}
{{ $dcs := index . 3 -}}
{{ if gt $n (int64 $dc.replicas) -}}
{{ template "emit-dcs" (list $server $dcs) -}}
{{ else -}}
server.{{ $server }}: {{ $dc.name }}-{{ $n }}
{{ template "emit-dc" (list (add1 $server) (add1 $n) $dc $dcs) -}}
{{ end -}}
{{ end -}}
На верхнем уровне мы знаем индекс следующего номера сервера плюс список центров обработки данных.Если этот список пуст, мы закончили.В противном случае мы можем начать испускать строки из первого центра обработки данных в списке.
{{ define "emit-dcs" -}}
{{ $server := index . 0 -}}
{{ $dcs := index . 1 -}}
{{ if ne 0 (len $dcs) -}}
{{ template "emit-dc" (list $server 1 (first $dcs) (rest $dcs)) -}}
{{ end -}}
{{ end -}}
Затем в вашем фактическом определении ресурса (скажем, в определении ConfigMap) вы можете вызвать этот шаблон с первым номером сервера:
{{ template "emit-dcs" (list 1 .Values.dataCenters) -}}
Скопируйте все это в фиктивную диаграмму Хелма, и вы сможете проверить вывод:
% helm template .
---
# Source: x/templates/test.yaml
server.1: a-1
server.2: a-2
server.3: a-3
server.4: b-1
server.5: b-2
Я подозреваю, что этот трюк не сработает, если количество серверов значительно превысит сотни(Движок шаблонов Go почти наверняка не является хвостовой рекурсивом ), и это несколько пытается навязать стандартные методы языка программирования на язык шаблонов, который не совсем для этого предназначен.Но ... это работает.