В продолжение бурной дискуссии в Helm это анти-паттерн.
Если необходимо заниматься дистрибуцией именно чартов Helm, то реализовать такую функциональность не составит особого труда.
С помощью директивы include в любой Makefile подключается еще один Makefile – helm.mk
Оказывается variable scoping – это давно решенная проблема и для этого не нужен ни YAML ни cuelang.
Пишется скрипт на Python который генерирует чарт Helm:
define GENERATE_HELM_SCRIPT
import os
import yaml
import sys
from pathlib import Path
def make_helm_compatible(value):
"""Convert values to Helm template syntax where appropriate"""
if isinstance(value, dict):
return {k: make_helm_compatible(v) for k, v in value.items()}
elif isinstance(value, list):
return [make_helm_compatible(v) for v in value]
elif isinstance(value, str) and value.isdigit():
return f"{{{{ .Values.{value} }}}"
return value
И он может заодно сгенерировать еще и схему для values файла.
Вызываем нужный таргет:
make generate-chart
Получаем Helm чарт:
tree vault-chart
vault-chart
├── Chart.yaml
├── templates
│ ├── clusterrolebinding-vault-server-binding.yaml
│ ├── configmap-vault-config.yaml
│ ├── service-vault-internal.yaml
│ ├── service-vault-service.yaml
│ ├── serviceaccount-vault-service-account.yaml
│ └── statefulset-vault.yaml
└── values.yaml
2 directories, 8 files
Правда заключается в том, что задачи которые решает DevOps успешно решались задолго до DevOps.
LLM сделали код дешевле, но зато дебажить стало непростительно дорого.