代码之家  ›  专栏  ›  技术社区  ›  Riduidel

使用jmespath,如何过滤至少定义了一个标签的consul服务?

  •  2
  • Riduidel  · 技术社区  · 7 年前

    我的Consul目录中定义了一个服务列表,我想删除那些没有定义标签的服务。

    此服务列表如下所示:

    {
        "json": {
            "consul": [],
            "consul-exporter": [],
            "consul-8600": [
                "traefik.enable=false",
                "udp"
            ],
            "snmp-gateway": [],
        }
    }
    

    我想使用jmespath过滤它,使结果只包含

    {
        "json": {
            "consul-8600": [
                "traefik.enable=false",
                "udp"
            ],
        }
    }
    

    但是jmespath过滤的语法对我来说仍然是模糊的。

    我想我应该用 length 函数获取属性数组的大小,但如何获取?

    到目前为止,我有一个 json.[length(*)>0] 过滤,但没有显示任何值。

    我应该更改什么以获得非空结果?

    2 回复  |  直到 7 年前
        1
  •  1
  •   techraf    7 年前

    在Ansible 2.5及更高版本中:

    可以将jmespath查询与ansible结合使用 dict2items 过滤器和Jinja2 dict 功能:

    - debug:
        msg: "{{ dict(json | dict2items | json_query('@[?value].[key, value]')) }}"
    
        2
  •  1
  •   techraf    7 年前

    我认为这是不可能与jmespath(至少不是一个简单的方式)。 the other answer .

    另一方面,用Python编写自己的过滤器是很简单的。( filter_plugins/myfilters.py ):

    class FilterModule(object):
        def filters(self):
            return {
                'remove_keys_with_empty_values': self.remove_keys_with_empty_values
            }
    
        def remove_keys_with_empty_values(self, mydict):
            newdict = dict((key, value) for key, value in mydict.iteritems() if value)
            return newdict
    

    在剧本中使用它:

    - debug:
        msg: "{{ json | remove_keys_with_empty_values }}"