проблема при подстановке переменных с помощью команды set в шаблоне jinja2 - PullRequest
0 голосов
/ 22 января 2019

У меня есть YAML-файл, который имеет значение по умолчанию для двух dict, определенных следующим образом:

sample:
  high:
    name: high-volume
    alias: hi-vl

hi-vl:
  ab1:    
    add:
      range: 0
      range1: 0
    remove:
      range: -1
      range1: -1

Чтобы выполнить итерацию и получить значения из шаблона jinja2, я использую код ниже:

{% for key, value in sample.iteritems() %}
{% set al = value.alias %}
{% for key1, value1 in al.iteritems()  %}

Когда я выполняю этот шаблон для генерации файла YAML, я получаю сообщение об ошибке:

"msg": "AnsibleUndefinedVariable: 'unicode object' has no attribute 'iteritems'"}

Переменная set изменяет переменную как юникод.Если я подставлю прямое value вместо value.alias в операторе set, итерация будет работать нормально.

Я попытался использовать фильтры типа to_yaml, tojson, но они конвертируются в строку и не отображаются как dict.

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете использовать Python для преобразования yaml в dict, создания строки jinja, загрузки строки jinja в класс Template и ее рендеринга:

Учтите, что yaml хранится в файле с именем * 1004.*.Сначала мы откроем его и преобразуем в dict:

import yaml
import json
from jinja2 import Template

with open('specs.yaml') as f:
  specs = f.read()
  specs_dict = yaml.load(specs) #get dict from yaml

print(json.dumps(test, indent=4)) #print pretty dict tree
#Output:

{
"sample": {
    "high": {
        "name": "high-volume",
        "alias": "hi-vl"
    }
},
"hi-vl": {
    "ab1": {
        "add": {
            "range": 0,
            "range1": 0
        },
        "remove": {
            "range": -1,
            "range1": -1
        }
    }
}
}

Теперь мы можем определить строку jinja и создать объект шаблона для ее визуализации.

#form jinja string
jinja_string = """{% for key, value in specs_dict['sample'].items() %}                              
{% set al = value['alias'] %}
{% for key, value in specs_dict[al].items() %}
{{key}}:{{value}}
{% endfor %}                        
{% endfor %}"""

# create template object and render it
template = Template(jinja_string)
print(template.render(specs_dict=specs_dict))
#Output:
ab1:{'add': {'range': 0, 'range1': 0}, 'remove': {'range': -1, 'range1':-1}}
...