Рендеринг переменных из файла - PullRequest
0 голосов
/ 28 сентября 2018

Существует файл api.yml, содержащий конфигурацию для ansible:

config/application.properties:
 server.port: 6081
 system.default.lang: rus
 api.pdd.url: "http://{{ stage['PDD'] }}"
 api.policy.alias: "integration"
 api.order.url: "http://{{ stage['Order'] }}
 api.foo.url: "http://{{ stage['FOO'] }}

Существует stage.yml, содержащий ключ и значения stage:

default_node:
 Order: '172.16.100.40:8811'
 PDD: '172.16.100.41:8090'
 FOO: '10.100.0.11:3165

ФактическиЭти файлы больше, и переменных 'stage' также много.Моя задача - разобрать api.yml и превратить его в properties-config.Проблема в том, что я не могу получить значения {{stage ['value']}} Я пытаюсь сделать это следующим образом:

stream = yaml.load(open('api.yml'))
result={}
result.update(stream['config/application.properties'])
context= yaml.load(open('stage.yml'))
stage={}
stage.update(context['default_node'])
text = '{% for items in result | dictsort(true)%}  {{ items[0] }} = {{
     items[1] }} {%endfor%}'

template = Template(text)
properti = (template.render(result=result, stage=stage))

На выходе я получаю это:

server.port = 6081
system.default.lang = rus
api.pdd.url = http://{{ stage['PDD'] }}
api.policy.alias = integration
api.order.url = http://{{ stage['Order'] }}
api.foo.url = http://{{ stage['FOO'] }}

И вам нужно получить это:

server.port = 6081
system.default.lang = rus
api.pdd.url = 172.16.100.41:8090
api.policy.alias = "integration"
api.order.url = 172.16.100.40:8811
api.foo.url = 10.100.0.11:3165

Могу ли я сделать это с помощью jinja или ansible lib?Извините за мой плохой английский

1 Ответ

0 голосов
/ 01 октября 2018

Следуя этому подходу, вам нужно будет обработать api.yml как сам шаблон и отобразить его.В противном случае jinja2 будет рассматривать его как простое значение свойства.Примерно так:

import yaml
from jinja2 import Environment, Template 
import json  


stream = yaml.load(open('api.yml'))
result={}
result.update(stream['config/application.properties'])
context= yaml.load(open('stage.yml'))
stage={}
stage.update(context['default_node'])
text = """{% for items in result | dictsort(true)%}  {{ items[0] }} = {{ items[1] }} {%endfor%}"""

#Then render the results dic as well
resultsTemplate = Template(json.dumps(result))
resultsRendered = json.loads( resultsTemplate.render(stage=stage) )

template = Template(text) 
properti = (template.render(result=resultsRendered, stage=stage))

После этого вы увидите требуемые значения в properti var:

'  api.foo.url = http://10.100.0.11:3165   api.order.url = http://172.16.100.40:8811   api.pdd.url = http://172.16.100.41:8090   api.policy.alias = integration   server.port = 6081   system.default.lang = rus'

Хотя было бы неплохо, если бы jinja2 мог рендеритьрекурсивно.Возможно, потратив некоторое время на работу с глобальными и общими режимами Environment , этого можно достичь.

Надеюсь, это поможет.

...