如何过滤ansible stat存在标志?

时间:2017-06-19 21:09:33

标签: ansible jmespath

我正在wpa_supplicant创建的命名管道上执行一个简单的stat任务(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过滤器成功查询其他值。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

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

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

我在stat[?filter]过滤器中的JMESPath的低估应用在stat内部(用于选择路径下方的元素),但是您想要应用过滤器来选择/拒绝stat兄弟姐妹,所以你应该停止使用管道和滤芯进一步投影。