Динамическая генерация сложных структур данных в Ansible - PullRequest
0 голосов
/ 08 декабря 2018

Я придумал следующий способ:

- 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 Ответ

0 голосов
/ 08 декабря 2018

по моему мнению:

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

_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 больше не будут доступны.

...