Динамическая генерация сложных структур данных в 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
не будет доступен где-либо еще.