Шаблонирование внешних файлов в руле - PullRequest
0 голосов
/ 23 января 2020

Я хочу использовать файл application.yaml для передачи в качестве карты конфигурации.

Итак, я написал это.

 apiVersion: v1
 kind: ConfigMap
 metadata:
  name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}

мой application.yaml находится в папке foo и содержит имя службы, которое мне нужно, чтобы оно динамически заполнялось через интерполяцию helm.

foo:
  service:
    name: {{.Release.Name}}-service

Когда я dry запускаю, я получаю это

apiVersion: v1
kind: ConfigMap
metadata:
  name: conf
data:
  application.yaml: "ei:\r\n  service:\r\n    name: {{.Release.Name}}-service"

, но я хочу name: {{.Release.Name}}-service содержать фактическое имя выпуска helm.

Можно ли создавать шаблоны для внешних файлов с помощью helm, если да, то как это сделать? Я прошел https://v2-14-0.helm.sh/docs/chart_template_guide/#accessing -files-inside-templates Я не нашел что-то, что решает мой вариант использования. Я также могу скопировать содержимое в конфигурационную карту yaml и выполнить интерполяцию, но я не хочу этого делать. Я хочу, чтобы application.yml находился в отдельном файле, чтобы иметь дело с изменениями конфигурации.

Ответы [ 2 ]

4 голосов
/ 23 января 2020

Шлем включает в себя функцию tpl , которую можно использовать для расширения произвольной строки в качестве шаблона Go. В вашем случае вывод ...AsConfig представляет собой строку, которую вы можете передать в механизм шаблонов.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-conf
data:
{{ tpl (.Files.Glob "foo/*").AsConfig . | indent 2 }}

Как только вы это сделаете, вы можете вызвать произвольный код шаблона из файла конфигурации. Например, достаточно часто иметь определенный шаблон, который выдает префикс имени текущей диаграммы в соответствии с настройкой, и поэтому в вашем конфигурационном файле вместо этого можно указать

foo:
  service:
    name: {{ template "mychart.name" . }}-service
1 голос
/ 23 января 2020

Насколько я могу судить, в helm (и в Sprig) нет рекурсивной оценки шаблонов, вероятно, по замыслу

Однако, в вашем конкретном случае c, если вы не ожидаете полная мощность golang шаблонов, вы можете обмануть и использовать regexReplaceAllLiteral от Sprig :

kind: ConfigMap
data:
{{/* here I have used character classes rather that a sea of backslashes
     you can use the style you find most legible */}}
{{ $myRx := "[{][{] *[.]Release[.]Name *[}][}]" }}
{{ regexReplaceAllLiteral $myRx (.Files.Glob "foo/*").AsConfig .Release.Name }}

Если вам действительно нужна полная мощность шаблонов golang для Ваши конфигурационные файлы, а затем и helm, сам по себе не является механизмом для этого, но helmfile содержит множество хитростей для генерации окончательной диаграммы helm, которую установит helm

...