Как подружить helm со своим шаблонизатором? | OTUS

Как подружить helm со своим шаблонизатором?

Helm использует go templates для рендеринга манифестов. Есть функции, которые были разработаны специально для helm. Но в большинстве своем используется библиотека Sprig.

e9c8e7e28cdf05808d18569bdd853e05_1-1801-ab882a.jpg

Но что, если нам мало функций и мы хотим воспользоваться каким-нибудь своим кастомным шаблонизатором?

В этой статье я покажу пример, как подключить шаблонизатор gomplate. Но это не помешает вам использовать какой-нибудь другой. Принципы одинаковые.

gomplate содержит огромное количество функций по работе со строками, сетью, криптографией и т.д.

Одна из киллер-фичей – получать данные из разных источников: файлы, https, git, ssh, AWS EC2 metadata, AWS Secret Manager, BoltDB, Hashicorp Consul и Hashicorp Vault.

Подготовка

Для начала надо установить helm и gomplate , если они еще не установлены.

$ brew install helm
$ brew install gomplate

Первая сложность: gomplate и helm используют одинаковые кавычки-разделители {{ и }} для шаблонов.

Можно было бы начать их экранировать. Но это ни к чему хорошему не приведет. Будет много некрасивого кода и кавычек. Поэтому проще назначить другие кавычки для gomplate.

export GOMPLATE_LEFT_DELIM="[["
export GOMPLATE_RIGHT_DELIM="]]"

Тестируем:

echo 'Hello, [[ .Env.USER ]]' | gomplate
Hello, zhilyaev

Создаем helm chart

# [[ defineDatasource "foo" "https://httpbin.org/get" ]]  
# [[ if not (datasourceReachable "foo")]] unreachable [[end]]
# [[ $d := ds "foo" ]]  
apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: {{ include "this.fullname" . }}  
  labels: {{ include "this.labels" . | nindent 4 }}  
data:  
  random: "[[ random.AlphaNum 32 ]]"  
  host: "[[ $d.headers.Host ]]"

Переходим к основной части. Helm имеет флажок --post-renderer его мы и будем жадно абузить.

Диаграмма работы:

7191f12d53cfa88e6b639d0f5ba9fa76_1-1801-daf49f.png

Запускаем:

helm template this chart --post-renderer gomplate
# Source: this/templates/configmap.yaml
#
# 
# 
apiVersion: v1
kind: ConfigMap
metadata:
  name: this
  labels:
    helm.sh/chart: this-0.1.0
    app.kubernetes.io/name: this
    app.kubernetes.io/instance: this
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
data:
  random: "2tJyK9xSsg1gvEmunEokQf4lyGkvojiQ"
  host: "httpbin.org"

Деплоим:

helm upgrade --install this chart --post-renderer gomplate
Profit

Послесловие

Внедрение --post-renderer вносит дополнительную сложность. Cледуя принципам KISS, попробуйте helmwave. В нем мы решаем повседневные проблемы при работе с helm, не вмешиваясь в функционал чартов.

Больше полезных материалов смотрите в моем блоге на Хабре: https://habr.com/ru/users/ZhilyaevDmitriy/.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться