Comments 9
А в продакшене используйте специализированные средства: consul-template, ansible и т.д.
Ansible хорош, но не панацея. Довольно часто, то что он делает значительно проще сделать Shell скриптами.
Скрипты не гарантируют правильный результат, если их запустить дважды.
Для инсталляции сервера (любого) делаю install.sh, который все ставит и настраивает. Скрипт рассчитан на работу в ОС с minimal install составе. Если его запустить 2 раза, то ничего не сломается и все будет тем же что и требуется, но дело не в этом.
Ansible хорош при управлении большим числом узлов, если массовости не требуется, то он избыточен и проще (быстрее) сделать скриптами.
Каждый инструмент хорош для своей задачи.
А вот в ubuntu сеть конфигурирует netplan, который хранит настройки в yaml:) Но YAML еще не худший вариант для редактирования скриптом, обычно yq неплохо с этим справляется. Больше проблем если конфиг в XML формате, например для включения русской озвучки в freeswitch мне приходилось использовать xsltproc и городить такое:
#!/bin/bash
FS_CONF=/opt/freeswitch/conf/autoload_configs/conference.conf.xml
if ! grep -q "elena" ${FS_CONF}; then
echo " - Enable Russian sound files for FreeSWITCH"
cp ${FS_CONF} ${FS_CONF}.tmp
sed -i 's/$${sounds_dir}\/en\/us\/callie/$${sounds_dir}\/ru\/RU\/elena/g' ${FS_CONF}.tmp
xsltproc /etc/bigbluebutton/bbb-conf/uncomment.xslt ${FS_CONF}.tmp > ${FS_CONF}
rm -f ${FS_CONF}.tmp;
fi
с дополнительным uncomment.xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="comment()">
<xsl:if test='contains(.,"elena")' >
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:if>
<xsl:if test='not (contains(.,"elena"))' >
<xsl:copy-of select="." />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Описанные способы ограниченны лишь включением отдельных переменных. Для чего-то более приближенного к реальным задачам, есть отличный mustache (условия, итерации по массивам) шаблонизатор на чистом баше https://github.com/tests-always-included/mo
Также могу порекомендовать свою поделку muenvsubst (пост о ней тут https://habr.com/ru/posts/904586/), которая была изначально придумана как более продвинутая замена envsubst с шаблонизатором на базе mustache, но потом была переписана на ещё более продвинутый шаблонизатор аналогичный Jinja.
6 вариантов генерации конфигурационных файлов Shell-скриптами