代码之家  ›  专栏  ›  技术社区  ›  x-yuri

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

  •  0
  • x-yuri  · 技术社区  · 6 年前

    我的想法是:

    - 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 回复  |  直到 6 年前
        1
  •  2
  •   mdaniel    6 年前

    在我看来:

    我认为你的部分问题是线路噪音与问题的实际“肉”混在一起;与之形成对比的是:

    _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模板中“泄漏”; r g 在其他任何地方都不可用。