2

我在我的 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]过滤器,但它没有显示任何价值。

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

4

2 回答 2

1

在 Ansible 2.5 及更高版本中:

可以通过将 JMESPath 查询与 Ansibledict2items过滤器和 Jinja2dict函数相结合:

- debug:
    msg: "{{ dict(json | dict2items | json_query('@[?value].[key, value]')) }}"
于 2018-09-09T05:47:31.623 回答
1

我认为 JMESPath 不可能做到这一点(至少不是以简单的方式)。 请参阅其他答案

另一方面,用 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 }}"
于 2018-05-29T19:22:39.647 回答