Рассчитать необходимые места в Jinja2 / Ansible
Я пытаюсь вычислить необходимое пространство на основе самого длинного слова в словаре.
Кажется, что переменная num
не передает его значение во второй внутренний цикл.
Я в основном пытаюсь рассчитать количество пробелов для правильного выравнивания столбцов.
{% for module in modules %}
module "{{ module.name }}" {
source = "{{ module.source }}"
{% set num = 1 %}
{% for n in module.vars.keys() %}
{% if num < n|length %}
{% set num = n|length %}
{% endif %}
{{ num }}: {{ n }}
{% endfor %}
{% for m in module.vars %}
{{ num }}
{{ m }} {{ '= "' + module.vars[m]|indent(width=num) }}"
{% endfor %}
}
1 ответ
Решение
Вы правы, вы не можете получить переменные из циклов таким образом. См. "Обзорное поведение" в документах.
Одним из вариантов является использование того, что они предлагают, и создание пространства имен:
{% set ns = namespace(num=0) %}
{% for n in module.vars.keys() %}
{% if ns.num < n|length %}
{% set ns.num = n|length %}
{% endif %}
{{ ns.num }}: {{ n }}
{% endfor %}
В вашем случае есть более простое и понятное решение: вы можете вычислить максимальную ширину в выражении. использование map()
чтобы получить список длин и использовать max
фильтр, чтобы получить самый большой:
{% set indent_width = module.vars.keys() | map("length") | max %}
{% for m in module.vars %}
{{ m }} {{ '= "' + module.vars[m]|indent(width=indent_width) }}"
{% endfor %}