Разбиение haproxy.cnf на файлы

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

Увы, но с конфигурационным файлом HAProxy так не получится. В нем нет директивы include ни в каком виде.

Можно при запуске или перезагрузке указывать несколько конфигурационных файлов:

haproxy -c /path/to/file1.cfg -c /path/to/file2.cfg

и т. д.

Однако в инитскриптах указан только один кофиг, из чего вытекает, что при запуске системы  или любом управлении haproxy через инит (например, service haproxy reload или systemctl haproxy reload ) будет считан не весь конфиг. Для обхода данного ограничения можно использовать следующий скрипт. Он читает файл /etc/haproxy/haproxy.draft и, там где встерчается фраза INCLUDE /path/to/file.cfg он подставляет содержимое указанного файла:

#!/bin/bash

CFG=/etc/haproxy/haproxy.cfg
NEWCFG=/tmp/haproxy.cfg.tmp
TMPCFG=/tmp/haproxy.cfg.$$
CONFIGDIR=/etc/haproxy/conf.d/
DRAFT=/etc/haproxy/haproxy.draft

cp $DRAFT $NEWCFG
grep_exit=0

while [ $grep_exit -ne 1 ]
do
config_line_count=`cat $NEWCFG | wc -l`
include_line_number=`grep -nEm1 'INCLUDE [0-9a-zA-Z_-]*\.cfg' $NEWCFG | cut -d':' -f1`
include_file=`grep -oEm1 'INCLUDE [0-9a-zA-Z_-]*\.cfg' $NEWCFG | cut -d' ' -f2`

let head_line_number=$include_line_number-1
let tail_line_number=$config_line_count-$include_line_number

head -$head_line_number $NEWCFG >> $TMPCFG
cat $CONFIGDIR/$include_file >> $TMPCFG
tail -$tail_line_number $NEWCFG >> $TMPCFG

rm $NEWCFG
mv $TMPCFG $NEWCFG

grep -sqE 'INCLUDE [0-9a-zA-Z_-]*\.cfg' $NEWCFG
grep_exit=$?
done
mv $NEWCFG $CFG

exit 0

Данный скрипт не проверяет целостность конфига (но можно добавить, это не сложно) и, пока, не поддерживает маски (например «*»).

Добавить комментарий