Q: Как отрендерить переменные из соседнего файла конфигурации? Есть файл api.yml содержащий конфиг вида:
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'

Моя задача распарсить api.yml и превратить его в properties-конфиг.
Проблема заключается в том, что не могу подтянуть значения {{ 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


A: Попробуйте передать следующую структуру данных:
stage = [{ "Order": '172.16.100.40:8811', 
           "PDD": '172.16.100.41:8090', 
           "FOO": '10.100.0.11:3165'}]

И использовать шаблон для списка словарей:
{% for dict_item in stage %}
   api.order.url = http://{{ dict_item["Order"] }}
{% endfor %}

Если jinja не обязательна посоветовал вам бы использовать python-форматирование. Я так когда-то отказался от jinja.
Вам понадобиться 4 файла (config.yml), первый собственно то, что хотим получить:
server.port = 6081
system.default.lang = rus
api.pdd.url = http://{PDD_value} 
api.policy.alias = integration
api.order.url = http://{Order_value}
api.foo.url = http://{FOO_value}

Второй файл (input.py) для значений переменных:
values = {
   "PDD_value": "111", 
   "Order_value": "2222", 
   "FOO_value": "333"
}

Третий для связи входного и выходного (reader.py):
from input import values

def read(file):
    with open(file, 'r') as f:
        t = f.read()
    return t

util = { "files": [
   {"file": "config.yml",
   "content": read_file(".../config.yml").format(**values)},
]
}

Ну и последний для запуска (run.py):
import reader
for item in reader.util["files"]:
    with open(item["file"], 'w') as f:
        f.write(item["content"])
        print 'Success'

Всё в одной папке стартуете run.py. После запуска перепишется файл config.yml - с проставленными входными из input
