Хочу представить свою утилиту muenvsubst для шаблонизации файлов, которая позволяет заменить всем известный envsubst, но при этом обладает гораздо более богатыми возможностями.
Основные фичи:
помимо шаблонизации файлов умеет шаблонизировать входной поток (stdin), используя переменные среды и результат выводить в выходной поток (stdout). Также как это делает envsubst
поддерживает синтаксис Jinja2 и его основные фичи, такие как условия, циклы, переменные, инклюды, различные вспомогательные функции (например, из шаблона можно звать shell-скрипты)
написана на C++ и собрана в статический бинарник x86 размером 350КБ без каких-либо дополнительных зависимостей, что позволяет её включать прямо в репозиторий и использовать в пайплайнах
Ранее я использовал в своих пайплайнах для шаблонизации mustache реализованные на bash и это было довольно удобно, но сам синтаксис и возможности mustache довольно ограниченные, а тащить что-то серьезное типа Jinja2 на питоне мне очень не хотелось, так как это тянуло за собой жирный рантайм, поэтому я и написал эту утилиту.
Надеюсь другим девопсам это зайдет так же как и мне. А также хотелось бы получить фидбек, может какие-то фичи ещё можно допилить?
Несколько примеров использования:
Простая подстановка переменной среды:
echo "Hello, {{ USER }}!" | muenvsubst
Шаблонизируем файл:
muenvsubst -i ./config.yml.j2 -o ./config.yml -d ./includes/
Использование переменных в шаблоне:
muenvsubst <<EOF {%- set username = upper(USER) -%} Hello, {{ username }}! EOF
Использование флагов и условий:
USE_GREETER=yes muenvsubst << EOF ## if default(USE_GREETER, null) | toBool Hello, {{ USER }}! ## else Bye, {{ USER }}! ## endif EOF
Использование циклов и разделение строки в список по символу:
USERS="John,Mark,Peter" muenvsubst << EOF {%- for user in split(USERS,",") -%} Hello, {{ user }}! {%- endfor -%} EOF
Использование инклюдов:
muenvsubst << EOF ## set USER="John" ## include "greeter.j2" EOF
Файл инклюда greeter.j2:
Hello, {{ USER }}!
