1

我正在由 wpa_supplicant 创建的命名管道上执行一个简单的统计任务(Ansible 2.3.1.0):

- stat:
    path: "/var/run/wpa_supplicant/{{ item }}"   
  with_items:
    - wifi
  register: wpa_stats   
  sudo: true

该变量在执行后包含以下数据:

ok: [10.10.23.187] => {
    "wpa_stats": {
        "changed": false, 
        "msg": "All items completed", 
        "results": [
            {
                "_ansible_item_result": true, 
                "_ansible_no_log": false, 
                "_ansible_parsed": true, 
                "changed": false, 
                "invocation": {
                    "module_args": {
                        "checksum_algorithm": "sha1", 
                        "follow": false, 
                        "get_attributes": true, 
                        "get_checksum": true, 
                        "get_md5": true, 
                        "get_mime": true, 
                        "path": "/var/run/wpa_supplicant/wifi"
                    }
                }, 
                "item": "wifi", 
                "stat": {
                    "atime": 1497900522.6306846, 
                    "attr_flags": "", 
                    "attributes": [], 
                    "block_size": 4096, 
                    "blocks": 0, 
                    "charset": "binary", 
                    "ctime": 1497900290.0605242, 
                    "dev": 18, 
                    "device_type": 0, 
                    "executable": true, 
                    "exists": true, 
                    "gid": 0, 
                    "gr_name": "root", 
                    "inode": 796, 
                    "isblk": false, 
                    "ischr": false, 
                    "isdir": false, 
                    "isfifo": false, 
                    "isgid": false, 
                    "islnk": false, 
                    "isreg": false, 
                    "issock": true, 
                    "isuid": false, 
                    "mimetype": "inode/socket", 
                    "mode": "0770", 
                    "mtime": 1497900290.0605242, 
                    "nlink": 1, 
                    "path": "/var/run/wpa_supplicant/wifi", 
                    "pw_name": "root", 
                    "readable": true, 
                    "rgrp": true, 
                    "roth": false, 
                    "rusr": true, 
                    "size": 0, 
                    "uid": 0, 
                    "version": null, 
                    "wgrp": true, 
                    "woth": false, 
                    "writeable": true, 
                    "wusr": true, 
                    "xgrp": true, 
                    "xoth": false, 
                    "xusr": true
                }
            }
        ]
    }
}

但是这个过滤器返回一个空的结果:

- debug:
    msg: "{{ wpa_stats | json_query('results[*].stat[?exists].path') | list }}"

如果我删除[?exists]过滤器它工作正常:

- debug:
    msg: "{{ wpa_stats | json_query('results[*].stat.path') | list }}"

我也尝试过使用==. Jmespath 已安装,我正在使用 JSON 过滤器成功查询其他值。

我错过了什么?

4

1 回答 1

2

我猜你想使用管道表达式:

results[*].stat | [?exists].path

根据我对过滤器中 JMESPath 的理解,在stat[?filter]内部应用了过滤器stat(以选择路径中的元素),但是您希望将过滤器应用于选择/拒绝stat兄弟姐妹,因此您应该停止使用管道和过滤器元素进行进一步的投影。

于 2017-06-20T06:35:29.747 回答