Динамическая генерация сложных структур данных в Ansible

Я придумал так:

- name: ...
  set_fact:
    _forwards: '{% set _r = [] %}{%
        for _g in _guests %}{{
            _r.append({
                "p_from_interface": "!lxcbr0",
                "p_from_port": hostvars[_g].ansible_port,
                "p_to_host": _g,
                "p_to_port": 22,
            }) }}{%
        endfor %}{{
        _r
    }}'
  vars:
    _guests: '{{
        hostvars
        | dictselectattr("location", "eq", inventory_hostname)
        | list
    }}'

Здесь я готовлю данные для следующих задач, которые будут добавлять соответствующие iptables правила. Есть ли способ сделать его более читабельным?

1 ответ

Решение

по-моему:

Я думаю, что частью вашей проблемы является шум линии, смешанный с фактическим "мясом" проблемы; Сравните это с чем-то вроде:

_forwards: |
   {%- set r = [] -%}
   {%- for g in guests %}{%
     set _ = r.append({
       "p_from_interface": "!lxcbr0",
       "p_from_port": hostvars[g].ansible_port,
       "p_to_host": g,
       "p_to_port": 22,
     })
   %}{% endfor -%}
   {{ r }}

Я также хотел отметить, что переменные jinja имеют блочную область видимости, поэтому вам не нужно ставить перед ними подчеркивание, чтобы они не "просочились" из шаблона jinja; r а также g не будет доступен где-либо еще.

Другие вопросы по тегам