Здравствуйте, уважаемые системные администраторы. Перед тем как задавать вам вопрос, я, честно, воспользовался поиском, но, к сожалению, ничего похожего не нашел. Вопрос, может быть, несколько оторван от реальности и имеет чисто исследовательский интерес, но тем не менее. Существует ли какое-то решение, которое позволяет использовать в конфиг-файлах юникс-системы переменные, циклы, условия и тд, т.е. конфиг должен представлять собой что-то типа шаблона, который динамически и прозрачно для читающего его приложения проходит разбор, подстановку переменных, выполнение ветвлений и тд. В результате приложение получит уже готовый конфиг в требуемом ему формате. Я знаю, что существуют решения вроде puppet (скажу сразу, я им не пользовался и не знаю его функциональных возможностей, а значит если он все это умеет, то заранее прошу простить мое невежество), но в данном случае речь о центральном хранилице конфигов не идет. Я попробую на примере конфига nginx более точно объяснить свой вопрос.
1) Есть директива worker_processes. На сколько я помню, ее следует устанавливать в к-во ядер на машинке. Было бы удобно написать что-то типа worker_processes = {{ 'nproc'|shell }}; - выполнить шел-команду и ее результат подставить на место переменной (да, я знаю, что в новых версиях nginx появился параметр auto). Мы берем конфиг с такими подстановками заливаем на все сервера и на каждом сервере он для nginx будет разный. Аналогично можно будет поступить и с другими директивами. Если предположить, что значение кокой-то директивы зависит от параметров ядра и от железа машинки, с помошью шел-команд и пайпов мы можем вычислить необходимые значения. Это позволит нам написать один раз конфиг, который, по возможности, будет затюнен для каждой машинки на которой он используется.
2) У меня 10 практически идентичных виртуальных nginx-хостов. Они отличаются только портом бекенда и путем к подключаемому для каждого хоста доп файлу конфигурации (что-то типа per-site config).Могу ли я сделать что-то типа этого?
{% for host_name, backend_port in [('host1', 123), ('host2', 321)] %}
server {
listen 80;
server_name {{ host_name }};
........
proxy_pass http://localhost:{{ backend_port }}/;
.........
include vhosts/{{ host_name}}.conf;
}
{% endif %}
Я далек от мысли, что подобный вариант работы с конфигами пришел в голову только мне, но пока мои поиски готового решения не увенчались успехом. Также хочу спросить, имеет ли смысл использовать подобные решения? Имеет ли оно право на существование, и если да, то где его целесообразно применять? Как вы, уважаемые системные администраторы, подходите к решению подобных вопросов?
Заранее благодарен за любую оказанную помощь