按dict键过滤dicts列表

时间:2015-08-10 15:32:43

标签: dictionary jinja2 ansible ansible-playbook

我有一份清单:

@Resource

我想删除dict元素{ "foo": [ "A", "B", "C" ], "bar": [ ], "baz": [ "D", "E" ] } ,以便只保留barfoo。这甚至不需要动态检测空列表,我知道元素baz将为空,我很乐意有一个解决方案来删除名称 - 或者如果更容易删除空列表。< / p>

我想用过滤器做这个,而不是在Ansible循环中。有没有写过自定义过滤器的机会?我还没有找到任何内置过滤器,看起来它可以做到这一点。 barreject使用dicts列表,而不是包含列表的dict。

1 个答案:

答案 0 :(得分:3)

---
- hosts: all
  gather_facts: no
  vars:
    dict: { foo: [ A, B, C ], bar: [], baz: [ D, E ] }
    dict_filtered: |
      {%- set o={} %}
      {%- for k, v in dict.iteritems() %}
        {%- if v %}
          {%- if o.update({k: v}) %}
          {%- endif %}
        {%- endif %}
      {%- endfor %}
      {{ o }}
  tasks:
    - debug:
        var: dict_filtered

示例会话:

$ ansible-playbook -i localhost, playbook.yml 

PLAY [all] ******************************************************************** 

TASK: [debug ] **************************************************************** 
ok: [localhost] => {
    "var": {
        "dict_filtered": {
            "baz": [
                "D", 
                "E"
            ], 
            "foo": [
                "A", 
                "B", 
                "C"
            ]
        }
    }
}

PLAY RECAP ******************************************************************** 
localhost                  : ok=1    changed=0    unreachable=0    failed=0