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

时间:2018-12-08 16:16:25

标签: dictionary ansible jinja2 ansible-template

我想到的方法是:

- 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 :(得分:2)

我认为:

我认为您的问题的一部分是线路噪声与问题的实际“肉”混合在一起;与以下内容进行对比:

_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是块作用域的,因此您不需要在其下划线加下划线,以防止它们从jinja模板中“漏出”; rg在其他任何地方都无法使用。