在 Ansible 中动态生成复杂的数据结构

Dynamically generating complex data structures in 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规则。有没有办法让它更具可读性?

我认为:

我认为您的部分问题是线路噪声与实际问题 "meat" 混合在一起;将其与类似的东西进行对比:

_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 vars 是块范围的,所以你不需要在它们前面加上下划线来防止它们 "leaking" 在你的 jinja 模板中; rg 将无法在其他任何地方使用。