HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: devops, golang, helm, kubernetes, gomplate</p>
1 <p>Теги: devops, golang, helm, kubernetes, gomplate</p>
2 <p>Helm использует<strong>go templates</strong>для рендеринга манифестов. Есть функции, которые были разработаны специально для helm. Но в большинстве своем используется библиотека Sprig.</p>
2 <p>Helm использует<strong>go templates</strong>для рендеринга манифестов. Есть функции, которые были разработаны специально для helm. Но в большинстве своем используется библиотека Sprig.</p>
3 <p>Но что, если нам мало функций и мы хотим воспользоваться каким-нибудь своим кастомным шаблонизатором?</p>
3 <p>Но что, если нам мало функций и мы хотим воспользоваться каким-нибудь своим кастомным шаблонизатором?</p>
4 <p>В этой статье я покажу пример, как подключить шаблонизатор<strong>gomplate</strong>. Но это не помешает вам использовать какой-нибудь другой. Принципы одинаковые.</p>
4 <p>В этой статье я покажу пример, как подключить шаблонизатор<strong>gomplate</strong>. Но это не помешает вам использовать какой-нибудь другой. Принципы одинаковые.</p>
5 <p><strong>gomplate</strong>содержит огромное количество функций по работе со строками, сетью, криптографией и т.д.</p>
5 <p><strong>gomplate</strong>содержит огромное количество функций по работе со строками, сетью, криптографией и т.д.</p>
6 <p>Одна из киллер-фичей - получать данные из разных источников: файлы, https, git, ssh, AWS EC2 metadata, AWS Secret Manager, BoltDB, Hashicorp Consul и Hashicorp Vault.</p>
6 <p>Одна из киллер-фичей - получать данные из разных источников: файлы, https, git, ssh, AWS EC2 metadata, AWS Secret Manager, BoltDB, Hashicorp Consul и Hashicorp Vault.</p>
7 <h3>Подготовка</h3>
7 <h3>Подготовка</h3>
8 <p>Для начала надо установить helm и gomplate , если они еще не установлены.</p>
8 <p>Для начала надо установить helm и gomplate , если они еще не установлены.</p>
9 $ brew install helm $ brew install gomplate<p>Первая сложность:<strong>gomplate</strong>и<strong>helm</strong>используют одинаковые кавычки-разделители {{ и }} для шаблонов.</p>
9 $ brew install helm $ brew install gomplate<p>Первая сложность:<strong>gomplate</strong>и<strong>helm</strong>используют одинаковые кавычки-разделители {{ и }} для шаблонов.</p>
10 <p>Можно было бы начать их экранировать. Но это ни к чему хорошему не приведет. Будет много некрасивого кода и кавычек. Поэтому проще назначить другие кавычки для<strong>gomplate</strong>.</p>
10 <p>Можно было бы начать их экранировать. Но это ни к чему хорошему не приведет. Будет много некрасивого кода и кавычек. Поэтому проще назначить другие кавычки для<strong>gomplate</strong>.</p>
11 export GOMPLATE_LEFT_DELIM="[[" export GOMPLATE_RIGHT_DELIM="]]"<p>Тестируем:</p>
11 export GOMPLATE_LEFT_DELIM="[[" export GOMPLATE_RIGHT_DELIM="]]"<p>Тестируем:</p>
12 echo 'Hello, [[ .Env.USER ]]' | gomplate Hello, zhilyaev<h3>Создаем helm chart</h3>
12 echo 'Hello, [[ .Env.USER ]]' | gomplate Hello, zhilyaev<h3>Создаем helm chart</h3>
13 # [[ 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 ]]"<p>Переходим к основной части. Helm имеет флажок --post-renderer его мы и будем жадно абузить.</p>
13 # [[ 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 ]]"<p>Переходим к основной части. Helm имеет флажок --post-renderer его мы и будем жадно абузить.</p>
14 <p>Диаграмма работы:</p>
14 <p>Диаграмма работы:</p>
15 <h4>Запускаем:</h4>
15 <h4>Запускаем:</h4>
16 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"<h4>Деплоим:</h4>
16 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"<h4>Деплоим:</h4>
17 helm upgrade --install this chart --post-renderer gomplate<h5>Profit</h5>
17 helm upgrade --install this chart --post-renderer gomplate<h5>Profit</h5>
18 <h2>Послесловие</h2>
18 <h2>Послесловие</h2>
19 <p>Внедрение --post-renderer вносит дополнительную сложность. Cледуя принципам KISS, попробуйте<strong>helmwave</strong>. В нем мы решаем повседневные проблемы при работе с helm, не вмешиваясь в функционал чартов.</p>
19 <p>Внедрение --post-renderer вносит дополнительную сложность. Cледуя принципам KISS, попробуйте<strong>helmwave</strong>. В нем мы решаем повседневные проблемы при работе с helm, не вмешиваясь в функционал чартов.</p>
20 <p><em>Больше полезных материалов смотрите в моем блоге на Хабре: https://habr.com/ru/users/ZhilyaevDmitriy/.</em></p>
20 <p><em>Больше полезных материалов смотрите в моем блоге на Хабре: https://habr.com/ru/users/ZhilyaevDmitriy/.</em></p>
21  
21