bash, создание конфигурационных файлов на основе шаблонов
почему именно баш?
Не обязательно bash. Сейчас просто эта функциональность (частичная) есть часть bash-скрипта, который генерирует конфигурационные файлы и подсовывает их другой программе. Если можно сделать иначе, подсткажите, пожалуйста.
google: bash m4
Правильно ли я понимаю, что вместо двух входных аргументов (variables и templates) останется только один templates, который m4 будет парсить? Не мог бы ты словами описать, что нужно сделать, чтобы воспроизвести пример, описанный в первом посте?
Template with VAR1={{ VAR1 }} and VAR2={{ VAR2 }}
[variables]
VAR1=VAR1_ONE VAR1_TWO
VAR2=VAR2
import jinja2
import ConfigParser
import itertools
def main:
config = ConfigParser.ConfigParser
config.optionxform = str
config.read('vars.txt')
variables = {var[0]: var[1].split(' ') for var in config.items('variables')}
print 'Variables: {}'.format(variables)
env = jinja2.Environment(loader=jinja2.FileSystemLoader('.'
template = env.get_template('template.txt')
for var_values in itertools.product(*variables.values:
print template.render(dict(zip(variables.keys var_values
if __name__ == '__main__':
main
giz-ThinkCentre-M90p:~/flocal$ python script.py
Variables: {'VAR1': ['VAR1_ONE', 'VAR1_TWO'], 'VAR2': ['VAR2']}
Template with VAR1=VAR1_ONE and VAR2=VAR2
Template with VAR1=VAR1_TWO and VAR2=VAR2
Спасибо огромное за код!
Но если в кратце то да - по сути m4 передаётся на стандартный вход (или он сам читает из файла) некий шаблон у которого в начале определяются переменные а потом на основании этих переменных строятся какие-то сложные конфиги с ифами, инклюдами и т.п.
Определять переменные можно разными способами:
home:~$ m4выводит тоже самое что и
define(`temp', `123')
format(`My variable is %d', temp)
home:~$ m4 --define temp=123
format(`My variable is %d', temp)
My variable is 123
вообще там сложный синтаксис шаблонов http://www.gnu.org/software/m4/manual/m4.html не плане что он сложен для освоения (хотя это тоже а в плане что позволяет получить сложные конструкции.
Я если честно не очень понял какое именно поведение ты ожидаешь. И в каком виде ты имеешь переменные и шаблоныПример, который я привёл в первом посте, покрывает все требуемые нужды.
Программа, которую привёл решает задачу точь-в-точь.
Я понял, что m4 делает разнообразные макроподстановки, но мне не ясно, как она будет справляться со случаем, когда переменная имеет несколько значений.
Спасибо, предложенный подход очень гибкий и полностью решает поставленную задачу.
Оставить комментарий
kataich
Здравствуйте.Я хотел бы генерировать конфигурационные файлы на основе заранее определенных шаблонов. Я хочу иметь bash-скрипт, на вход которого подаётся шаблон и значения переменных, а на выходе получается множество конфигурационных файлов. К примеру,
# cat variables
VAR1="VAR1_ONE VAR1_TWO"
VAR2="VAR2"
# cat template
Template with VAR1=${VAR1} and VAR2=${VAR2}
# generate variables template
Template with VAR1=VAR1_ONE and VAR2=VAR2
Template with VAR1=VAR1_TWO and VAR2=VAR2
1) generate заменяет все вхождения типа ${} на значения, определенные в файле переменных. При определении переменная может принимать несколько значений.
2) Таким образом, generate понимает, что некоторые переменные имеют более, чем одно значение, и по сути составляет декартово произведение из них.
3) Имена переменных пользователь может выбирать сам. То есть файл шаблонов и файл переменных должен быть согласован (в том смысле, что в шаблоне можно использовать только те переменные, которые определены в файле переменных но имеется полная свобода, как эти переменные пользователь может назвать.
Спасибо